git merge 与 git rebase 的区别

楔子

    从下面这张丑图,应该大概知道:1)这两个命令都能达到两分支合并的效果;2)git rebase 最终的效果比git merge 的要漂亮。
git merge 与 git rebase 的区别_第1张图片

    再仔细看图,可以发现git merge 是通过暴力地将两分支的最新commit 揉合到一个新的commit 上达到合并效果的。而git rebase 则是通过一种续接的方式:将master 拆下,续到b1上来。就相当于本来master 与b1都在同一起点,现在改为master的起点为b1。
    下面是个小例子。

1

我当前仓库除了主分支master之外还有两个分支branch_code 与 branch_mun。
当前我已将可视化工具——Git Extensions 切为“显示所有分支”。此时是很漂亮的一条竖直线。
git merge 与 git rebase 的区别_第2张图片

2

    切到branch_mun分支,修改一下内容,并提交commit ;再切回master,修改一下内容,也提交commit。最后切回master ,并将GE的视图显示为所有分支:
git merge 与 git rebase 的区别_第3张图片

3

    在master分支 执行 git rebase branch_mun 进行分支合并,得到提示很多,其中有提示有一个冲突。那我们去解决一下
git merge 与 git rebase 的区别_第4张图片
    解决冲突后,git status 看一下状态,它提示可以git add 
git merge 与 git rebase 的区别_第5张图片
    git status 再看一下
git merge 与 git rebase 的区别_第6张图片
    提示可以执行 git rebase --continue 执行后,合并完成。
git merge 与 git rebase 的区别_第7张图片
    查看GE,还是很漂亮的直线。
git merge 与 git rebase 的区别_第8张图片

4

    我们再次按照“2”操作一次,操作完查看GE
git merge 与 git rebase 的区别_第9张图片
    此次,我们用git merge 合并,提示有冲突。那么我们去解决冲突。
git merge 与 git rebase 的区别_第10张图片
    解决冲突后,git status查看状态
git merge 与 git rebase 的区别_第11张图片
    提示可以执行git add ,执行后查看状态,提示可执行git commit 
git merge 与 git rebase 的区别_第12张图片
    执行commit 后完成合并
git merge 与 git rebase 的区别_第13张图片
    查看GE,成了两条难看的交线。
git merge 与 git rebase 的区别_第14张图片

5

    我后悔了,还有没有补救呢。还是有的,此时还可以执行git rebase ,按3中的步骤一步步解决冲突后,最后还是会得到一条漂亮的直线。
git merge 与 git rebase 的区别_第15张图片

总结

    1)git rebase使commit 树看起来很漂亮,但是它把时间线打乱了。
git merge 与 git rebase 的区别_第16张图片
    2)git merge 的commit 树看起来很乱,但是时间线是顺着来的。
    3)使用哪种看各项目的需要吧。不过一般的老板都喜欢好看的,哈哈。

20170705

你可能感兴趣的:(linux)