The difference between merge and rebase

2018-05-14 17:55 阅读 80 次 评论 0 条

在实习的时候遇到过不少分支之间的冲突,在头条那种大家庭里是禁止使用merge的,但二者的利弊都是存在的,有幸被问到两者的区别,同时也为了让更多的人少走弯路,希望这篇文章可以帮助到你。

merge与rebase的执行过程

首先,我创建mergeTest、rebaseTest两个分支用于测试,并且保证二者提交的记录保持一致,如下图所示:

为了清晰起见,我以最近的两次提交即Test4、Test3用于实验,下图为merge前后的对比图:

上图刚开始看会觉得晦涩难懂,不过没关系,我会模拟一遍它的实现细节。分别对Test3、Test4进行修改提交,并push到远程分支origin/mergeTest上,记录commit id如下:

切换到rebaseTest分支,分别对test文件修改两次提交,并push到远程分支origin/rebaseTest,记录commit id如下:

此时你会发现,mergeTest和rebaseTest分别有两个领先的提交,这就模拟出了上图merge前的分支结构,即:C1<-C2<-C3<-C4为mergeTest分支结构,而C1<-C2<-C5<-C6为rebaseTest分支结构。

首先使用git fetch拉取mergeTest的最新代码至rebaseTest分支,再将mergeTest合并到rebaseTest分支:

再次查看rebaseTest分支的commit id会发现,在旧的提交记录上会生成一个新的commit id(d27281a),第2-3次为当前分支(rebaseTest)的记录,第4-5次为被合并分支(mergeTest)的记录,后面的记录保持同步。

因此,merge后会保留两个分支上的提交,并且会产生一个新的提交记录。

在rebase之前,先将merge的记录回溯到merge前的状态,再强制push到远端(不加force会报错,因为远端分支新于本地分支):

下图为rebase的前后对比图,我将模拟实现以下分支结构:

首先使用git fetch拉取mergeTest的最新代码至rebaseTest分支,再将mergeTest合并到rebaseTest分支:

push到远端之后,查看一下rebaseTest分支的commit id,发现第1-2次为新的提交记录,第3-4次为被合并分支(mergeTest)的提交记录,后面的记录保持一致:

因此,rebase后会保留被合并分支(mergeTest)的记录,对当前分支(rebaseTest)产生一个新的提交的副本,拼接到被合并分支的记录之后。

为了方便大家比对,我分别将merge、rebase前后的commit id整理出来如下:

冲突解决

首先我将mergeTest和rebaseTest分支回溯到最初始的同步状态:

我先模拟一些冲突,即对相同的文件在不同的分支进行修改。首先在mergeTest和rebaseTest分支下分别修改test3和test4文件进行提交,记录commit id如下:

此时,两个分支如果进行合并就会出现冲突,我先使用merge来测试:

上图出现了两个CONFLICT(因为我修改了两个文件),即merge会一次性将所有的冲突展示出来

如果要对两个分支上的修改同时保留,则需要删除test3和test4的3、5、7行:

解决完冲突后,merge需要手动add、commit生成一次提交,因此merge会一次性解决提交记录中的所有冲突

此时查看一下解决冲突之后的commit id,你会发现与没有冲突的merge场景是一致的:

下面我将使用rebase来进行冲突测试,首先在两个分支分别修改test3和test4进行提交,记录一下两个分支的commit id:

然后,我们拉取mergeTest的代码与rebaseTest进行rebase,但只出现了一个CONFLICT,说明rebase并不会将所有的冲突列举出来

根据提示,我先对test3文件进行冲突解决,解决后直接add+rebase --continue进行合并,这才出现了第二个CONFLICT:

因此,rebase一次只能解决一次提交上的冲突,如果多次提交都有冲突,则需要执行多次的rebase操作,冲突全部解决的状态如下图:

此时查看一下解决冲突之后的commit id,你会发现与没有冲突的rebase场景是一致的

这些就是merge与rebase的所有区别了,工作中会经常用到的,赶紧get吧。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:The difference between merge and rebase | 术与道的分享
分类:编程素养 标签:, ,
1024do.com导航_术与道导航平台

发表评论


表情