基本操作
初始化一个仓库
git init
添加文件到Git仓库
git add <file>
git commit -m <message>
显示工作区的状态
git status
git diff
可以查看文件被修改的内容
版本回退
HEAD
指向的版本就是当前版本,使用命令git reset --hard <commit_id>
可以回退到历史版本。
查看提交历史用git log
,以便确定要回退到哪个版本。
要重返未来的的版本,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
撤销修改
git checkout -- <file>
可以丢弃工作区的修改,让文件回到最近一次git commit
或git add
时的状态
用git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区
删除文件
git rm
用于从版本库中删除一个文件。
远程仓库
设置远程仓库
- 创建SSH Key。在用户主目录里找到
.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,id_rsa.pub
是公钥。 - 登录GitHub,打开"Account settings","SSH Keys"页面。
- 点"Add SSH Key",填上任意Title,在Key文本框里粘贴
id_rsa.pub
文件的内容。 - 点"Add Key",添加成功。
添加远程仓库
-
登录GitHub,创建一个新的仓库。
-
在本地的仓库运行
git remote add origin <remote_git_ssh_address>
-
把本地库的所有内容推送到远程库上:
git push -u origin master
由于远程库是空的,第一次推送
master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令git push origin master
。
分支管理
创建与合并分支
创建dev
分支,然后切换到dev
分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch
命令查看当前分支:
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
然后,就可以在dev
分支上正常提交。
git merge
命令用于合并指定分支到当前分支。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突
产生原因:不同分支对同一文件有不同的修改。
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph
命令可以看到分支合并图。
BUG分支
git stash
保存当前工作现场
git stash list
查看已保存的工作现场
git stash apply
恢复指定工作现场,但stash内容并不删除,需要用git stash drop
来删除
git stash pop
恢复的同事把stash内容也删了
保存工作现场后切换到BUG分支上,创建临时分支
git checkout -b issue-101
在’issue-101’分支上处理完BUG之后与原来的分支合并
git merge --no-ff -m "merged bug fix 101" issue-101
多人协作
从远程仓库clone下来的代码只能看到本地的master分支
$ git branch
* master
要在dev
分支上开发,就必须创建远程的origin
的dev
分支到本地,git checkout -b [分支名] [远程名]/[分支名]
$ git checkout -b dev origin/dev
另一方在dev
上产生冲突时,可以先git pull
,如果没有指定本地dev
分支与远程origin/dev
分支的链接,需要
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
再git pull
。
如果合并有冲突,需要手动解决后,在提交,push。
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突