参考:
????????http://t.csdn.cn/CkVrR
????????https://blog.csdn.net/weixin_42310154/article/details/119004977
一、简单图示
(1)merge
?(2)rebase
经验:
? ? ? ? 一般来说,不推荐使用rebase。
????????但为了让分支树看起来更简化,个人分枝偶尔也会选用rebase。这样可以线性的看到每一次提交,并且没有增加提交节点。? 但这样会存在缺陷:公共分支上rebase会打乱且篡改提交记录,若别人想看该公共分支的历史提交记录,它看到的不是完整的历史记录。
? ? ? ? 并且正在开发的其他分支会定期从master上合并代码,使开发分支保持最新。由于在master执行了rebase,maser历史会形成全新的提交。当合并过来后,git会认为和本地开发分支不一样,增加冲突可能性,更不知道代码提交顺序性,造成许多诡异现象。
二、区别
1、rebase 的冲突需要一个一个解决,如果有十个冲突,得先解决完第一个,然后执行如下命令后才会出现第二个冲突,直到所有冲突解决完。而merge 是一次性将所有的冲突都显示出来。
git add -u
git rebase --continue
另外,在rebase过程中,若想中途退出并恢复到rebase前的代码,可以用命令:
git rebase --abort
三、适用场景
- git merge适合公共分支,将其他分支合并到公共分支,merge操作两个分支最新的提交点会形成新的一个提交点,使后合并进来的commit记录仍然保持在后边。(merge以后会多出无意义的一条提交记录“Merge … to …”)
- git rebase适合个人分支(只自己一个人提交)。日常开发过程中,个人分支代码需要和公共分支代码保持一致最新,定期合并公共分支代码到个人分支。执行rebase操作后,会从指定分支上合并别人新的commit在我们的commit之前。(缺点是rebase以后就不知道当前分支最早是从哪个分支拉出来的了,因为基底变了)
四、图解举例演示说明
背景:
????????两个分支master和feature,
????????其中feature是在提交点B处从master上拉出的分支;
????????master上有一个新提交M,feature上有两个新提交C和D;
????????此时在feature分支上,执行?git rebase master 命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动)。
下图为变基后的提交节点图:
?解释下工作原理:
- feature:待变基分支、当前分支
- master:基分支、目标分支
????????rebase,变基,可以直接理解为改变基底。
????????feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交暂存下来,然后删掉原来这些提交,再找到master的最新提交位置,把暂存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了M而不是原来的B了。
(注意:如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)
上面的例子也可实例化为如下工作场景:
????????张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。
|