当前位置:   article > 正文

git merge与git rebase详解_git merge rebase

git merge rebase

参考:

        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 是一次性将所有的冲突都显示出来。

  1. git add -u
  2. git rebase --continue
  • rebase工作流
    1. git rebase
    2. while(存在冲突) {
    3. git status
    4. 找到当前冲突文件,编辑解决冲突
    5. git add -u
    6. git rebase --continue
    7. if( git rebase --abort )
    8. break;
    9. }
  • merge工作流 
    1. git pull
    2. 编辑冲突文件
    3. git add .
    4. git commit -m "feat: this is a comment"
    5. git push

另外,在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进行的开发了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/404442
推荐阅读
相关标签
  

闽ICP备14008679号