1. 安装Git及初始化Repository
全文参考廖雪峰网站,和自己的一些总结。
在Linux下,
$sudo apt-get install git
在Windows下,到Git官网下载安装https://git-scm.com/downloads
安装完后,在Git Bash里输入以下命令行完成设置,
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
建立repository,
mkdir learngit
cd learngit
pwd
git init
git remote add origin git@github.com:xxx/learngit.git
git checkout -b develop origin/develop
git pull
2. Git常用基本命令
Head指向当前分支
master指向主分支
Add
git add readme.txt
git add --all
Commit
git commit -m "commit message"
Check Status
git status
Find Difference
git diff readme.txt
查看工作区与版本库最新版的差别。
git diff HEAD -- readme.txt
Inspect Log, History
git log
git log --pretty=oneline
git reflog
Rebase
把本地未push的分叉提交历史整理成直线
git rebase
Reset
git reset --hard HEAD^
git reset --hard 1094a
HEAD^ 表示上一版本;HEAD^^ 表示上上版本;HEAD~100 表示上100版本
Give up Commit
git checkout -- readme.txt
丢弃工作区的修改,不commit:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
如需把暂存区的修改退回到工作区,则执行
git reset HEAD -- readme.txt
Remove
git rm test.txt
git commit -m "remove test.txt"
从版本库删除文件。
Restore
git checkout ./test/test.txt
在.git目录下恢复。
2. Remote and Branch
Link Remote
git remote add origin https://github.com/xxx/learngit.git
git remote add origin git@github.com:xxx/learngit.git
link local repository with remote repository.
Remove Remote
git remote rm origin
查看远程分支
git branch -r
git branch -a # 查看所有分支
用checkout命令把远程分支取到本地,并自动建立tracking
git checkout -b dev origin/dev
Push to Remote
git push -u origin master
Following push
git push origin master
Push dev to remote
git push origin dev
生成key
ssh-keygen -t rsa -f ~/.ssh/id_rsa.repos1 -C “Key for repos1” # 如果没有-f选项,系统会提示输入保存文件名,默认~/.ssh/id_rsa
cat ~/.ssh/id_rsa.repos1.pub # 查看公钥内容
将公钥拷贝下来,输入到gitee的key新建中,之后不需要再输入密码就可以pull和push了
ubuntu 添加多个ssh公钥和私钥
linux管理多个ssh公钥密钥
ssh-keygen -t rsa -f ~/.ssh/id_rsa.repos2 -C “Key for repos2”
生成好了公钥和密钥后,将公钥添加到相应的git的仓库的key中,测试ssh
ssh-add id_rsa.repos1 id_rsa.repos2 # 添加公钥到列表
ssh-add -l # 查看rsa列表
ssh -T git@gitee.com
ssh默认只读取id_rsa的密钥,如果多个密钥,需要添加config文件,
cd ~/.ssh
touch config
chmod 600 ~/.ssh/config
在config添加如下内容,
Host gitee.com
HostName gitee.com
User 用户名
IdentityFile ~/.ssh/id_rsa.repos1
Clone Remote
git clone https://github.com/xxx/hello-world
git clone git@github.com:xxx/hello-world.git
Create Branch
Create and switch to branch
git checkout -b dev
Create branch
git branch dev
Switch to branch
git checkout dev
or
git switch -c dev
创建远程origin的分支到本地
git checkout -b dev origin/dev
Inspect Branch
git branch
Switch to Master
git checkout master
or
git switch master
Merge Branch
Merge branch (fast forward mode)
git merge dev
Non fast forward mode (recommended)
git merge --no-ff -m "merge with no-ff" dev
Delete Branch
git branch -d dev
Inspect Merge Graph
git log --graph
Stash
Store current work temporarily which not added or committed yet and then be free to switch to another branch to create new branch for solving bugs or issues.
git stash
Inspect temporarily stored work list
git stash list
Restore work
git stash pop
or
git stash apply
git stash drop
将一个分支修复的bug复制到当前分支
git cherry-pick <commit id>
开发一个新feature,最好新建一个分支。如果要丢弃一个没有被合并过的分支,可以通过以下命令强行删除。
git branch -D <name>
Inspect Remote
git remote -v
Update from Remote
git pull
Create Tag
git tag v1.0
git tag v0.9 f52c633
git tag -a v0.1 -m "version 0.1 released" 1094adb
Inspect Tag
git tag
git show v0.9
Remove Tag
git tag -d v1.0
Push tag to remote
git push origin v1.0
git push origin --tags
Remove tag from remote
git tag -d v1.0
git push origin :refs/tags/v0.9
3. 多人协作
Setup to track remote dev with local dev
git branch --set-upstream-to=origin/dev dev
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3)如果合并有冲突,则解决冲突,并在本地提交;
4)没有冲突或者解决掉冲突后,再用git push origin <branch-name>
推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
4. 取消跟踪
参考博文:
在git是用过程中,可能遇到以下情况:
- 被跟踪文件里面有不想跟踪的文件。
- 每次用git status查看状态时总是列出未被跟踪的文件。
解决方法:
- 当被跟踪的文件里面有不想跟踪的文件时,列出你需要取消跟踪的文件,可以查看列表,检查下是否有误操作导致一些不应该被取消的文件取消了,是为了再次确认的。
git rm -r -n --cached 文件或目录
-r 表示递归,
-n 表示先不删除,只是列出文件。
使用命令git rm删除文件,如删除readme1.txt的跟踪,并保留在本地:
git rm -r --cached readme1.txt
删除readme1.txt的跟踪,并且删除本地文件:
git rm --f readme1.txt
然后git commit即可,但是git status查看状态时还是会列出来。
- 每次用git status查看状态时总是列出未被跟踪的文件,可以通过.gitignore文件达到目的。
在仓库的根目录下建立.gitignore文件,在windows系统直接新建会提示无法建立以“.“开头的文件,可以在git bash中通过命令$touch .gitignore
来建立文件。 此文件也需要被commit到库做版本管理。
使用如下语法进行填写文件:
/foldername/ :过滤整个文件夹
*.zip :过滤所有.zip文件
/ foldername/filename.c:过滤某个具体文件
被过滤掉的文件就不会出现在你的GitHub库中了,当然本地库中还有,只是push的时候不会上传。
需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中:
!*.zip
!/ foldername /filename.txt
唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。
为什么要有两种规则呢?想象一个场景:我们只需要管理/foldername/目录中的filename.txt文件,这个目录中的其他文件都不需要管理。那么我们就需要使用:
/foldername/
!/ foldername /filename.txt
假设我们只有过滤规则没有添加规则,那么我们就需要把/foldername/目录下除了filename.txt以外的所有文件都写出来!
最后需要强调的一点是,如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。
5. 常见问题
远程更新,本地也更新,但双边没有同步,这种情况push时会提示错误:“error: failed to push some refs to”
解决办法:
git pull --rebase origin master
git push origin master