• git merge与git 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进行的开发了。

  • 相关阅读:
    Java 异步和同步有什么不同呢?
    Android 13.0 修改系统签名文件类型test-keys为release-keys
    【飞控开发高级教程2】疯壳·开源编队无人机-遥控整机代码走读、编译与烧写
    基于单片机的导盲拐杖设计
    数据结构之树和二叉树的基本概念,二叉树遍历算法的实现
    使用SDEI上报RAS故障
    Spring实例化源码解析之registerBeanPostProcessors(六)
    [备忘.Linux]服务部署管理常用命令|systemd
    python LeetCode 刷题记录 67
    JAVA----List接口的三种实现类
  • 原文地址:https://blog.csdn.net/qq_35535785/article/details/126269443