楔子
从下面这张丑图,应该大概知道:1)这两个命令都能达到两分支合并的效果;2)git rebase 最终的效果比git merge 的要漂亮。
再仔细看图,可以发现git merge 是通过暴力地将两分支的最新commit 揉合到一个新的commit 上达到合并效果的。而git rebase 则是通过一种续接的方式:将master 拆下,续到b1上来。就相当于本来master 与b1都在同一起点,现在改为master的起点为b1。
下面是个小例子。
1
我当前仓库除了主分支master之外还有两个分支branch_code 与 branch_mun。
当前我已将可视化工具——Git Extensions 切为“显示所有分支”。此时是很漂亮的一条竖直线。
2
切到branch_mun分支,修改一下内容,并提交commit ;再切回master,修改一下内容,也提交commit。最后切回master ,并将GE的视图显示为所有分支:
3
在master分支 执行 git rebase branch_mun 进行分支合并,得到提示很多,其中有提示有一个冲突。那我们去解决一下
解决冲突后,git status 看一下状态,它提示可以git add
git status 再看一下
提示可以执行 git rebase --continue 执行后,合并完成。
查看GE,还是很漂亮的直线。
4
我们再次按照“2”操作一次,操作完查看GE
此次,我们用git merge 合并,提示有冲突。那么我们去解决冲突。
解决冲突后,git status查看状态
提示可以执行git add ,执行后查看状态,提示可执行git commit
执行commit 后完成合并
查看GE,成了两条难看的交线。
5
我后悔了,还有没有补救呢。还是有的,此时还可以执行git rebase ,按3中的步骤一步步解决冲突后,最后还是会得到一条漂亮的直线。
总结
1)git rebase使commit 树看起来很漂亮,但是它把时间线打乱了。
2)git merge 的commit 树看起来很乱,但是时间线是顺着来的。
3)使用哪种看各项目的需要吧。不过一般的老板都喜欢好看的,哈哈。
20170705