合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
过程如下:
#创建新分支dev
$ git checkout -b dev
Switched to a new branch 'dev'
#修改其中一个文件,并提交一个新的commit:、
git add <name>
git commit -m "commit"
#切换回master:
git checkout master
#准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
git merge --no-ff -m "merge with no-ff" dev
#查看历史纪录
git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
bug分支
出现bug,需要立刻修复。
目前正在dev分支分支上开发,尚未add和commit,修复bug时需要保留dev上内容
-
git stash
把前工作现场“储藏”起来,等以后恢复现场后继续工作 - git status查看工作区,就是干净的
- 创建bug分支
- 修复bug并提交
- 切换到master分支
- 完成合并
git merge --no-ff -m "merged bug fix 101" issue-101
- 返回到dev分支
此时检查状态git status工作区是干净的,git stash是针对工作区(working directory)来说的,对缓存区无效。 - git stash list查看stash里的内容
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
当多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
feature分支
每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
开发完成后:
git branch -d feature-vulcan
用于删除合并后的分支
git branch -D feature-vulcan
强制删除分支
远程库管理
git remote
查看远程库信息
git remote -v
显示更详细的信息
推送分支:
git push origin master
推送主分支
推送其他分支,比如dev,就改成:
$ git push origin dev
从远程库clone时,默认情况下,只能看到本地的master分支。
要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
git fetch [remote-name] //抓取远程仓库的全部内容,但是不会自动合并
git pull //抓取远程仓库跟踪分支的内容,并自动合并到本地相应的分支
你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:
推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream dev origin/dev
Branch dev set up to track remote branch dev from origin.
git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。