Git rebase or merge?

You ask me a question, I tell you a story.
— from null

这里也讲一下自己的理解。

本文所述主分支指Master或者develop分支,新分支指feature-或者bugfix-分支。

原理

二者的同

相同点显而易见,都是用作分支的合并。

二者的不同

下面是操作的步骤,从最后的结果可以看出不同点。

1,首先进行一些基本操作

//新建文件夹并git初始化
mkdir test
cd test
git init

2,在分支master上新建分支nb1和nb2,并且每个分支上做了两个commit。

此时二者是同时从master分支上checkout出来的,所以二者的base是一致的。

prepare job.png

这时nb1和nb2的log graph形状都是这样的:

接下来我是要把分支nb1和nb2的改动都合并到master分支上。

###3,首先我把nb1先合并到master分支上.使用git merge. 合并完成后的log graph:
nb1 log

下面的操作就可以看出不同了。

###4,使用rebase的效果。 首先,我先rebase master,这也是我们酒店代码提交所要求的。

//在nb2分支上做的操作
git rebase master

//切换到master分支合并
git checkout master
git merge nb2

这时得到的log graph 是这样的:
master log

###5, 使用merge 这里,在nb2分支上不rebase,直接切换到master分支上合并。

git checkout master git merge nb2

效果图是这样的:
rebase

6,不同点清自行对比上两幅图

其他

有人说为什么不在主分支做rebase?而且所有合并代码的工具默认使用的都是merge操作?

大部分情况下在主分支上做合并操作的和新分支开发的根本就不是一个人,所以合并操作的人根本不熟悉你的分支,那么他根本就不应该重新定义你所做的改动的base。他若改了,你定会心里说上无数遍:
不熟悉老子代码还要乱改老子commit的base,你你你你。。。。