zoukankan      html  css  js  c++  java
  • cherry-pick,revert和rebase使用的3-way合并策略

      git中的cherry-pick,revert和rebase都使用的是3-way合并策略,下面就来看看这3个方法使用的merge-base,ours和theirs分别是什么。

    cherry-pick

      假如有如下的提交历史,使用命令git cherry-pick alt(当前branch是master),那么merge-base就是加阴影的commit 1,ours就是加阴影的commit 3,theirs就是加阴影的commit 2。

    revert

      假如有如下提交历史,使用命令git revert master~2,那么merge-base就是加阴影的commit 1,ours就是加阴影的commit 3,theirs就是加阴影的commit 2.

    rebase

      假如有如下提交历史,每一个提交都向一个文件a里面增加一行,比如commit 1向文件a里面写入1,commit 2向文件a里面写入2,依次类推。使用命令git rebase --onto master alt1 alt2时,merge-base,ours,theirs分别是什么呢?

    当使用rebase命令时,git如做如下3件事:

    1 确定要rebase的commit是什么,这里要rebase的commit就是alt1..alt2。alt1..alt2表示从alt2可reachable的commit当中减去从alt1同样可以reachable的commit,这里就是commit 10,commit11,commit12;

    2 使用一个匿名branch指向alt2

    3 将alt2 reset到新的base,即master

    如下图所示:

    接下来git会依次将commit 10,commit 11, commit 12 rebase到新的alt2上。如果在rebase commit 10发生了冲突,那么merge-base就是commit 6,ours就是alt2指向的commit 5,theirs就是commit 10。如果commit 10 rebase成功后的commit记为commt 10’(此时alt2会指向commit 10'),接下来rebase commit 11如果也发生了冲突,那么merge-base同样是commit 6,ours是commit 10',theirs是commit 11。当rebase完成之后如果所示:

    由于rebase之后commit 10,commit 11,commit 12没有被任何分支引用,它们最后会被git移除。

    rebase有一个特殊的情况如下图所示:

    如果运行命令git rebase --onto master alt1 alt2,要被rebase的commit应该是alt2上的commit 7,commit 8, commit 10,但是由于alt1(在git rebase --help中,alt1被称为upstream),上面也有commit 7和commit 8,它们对文件a所做的修改时一样的,这时,git只会rebase alt2上的commit 10,相应merge-base也会成为alt1上的commit 8,最后的结果如下图,rebase完成之后,虚线框中的commit 7,commit 8, commit 10同样会被git移除。

  • 相关阅读:
    chart制作流程
    grep通过下面參数控制上下文
    PV、PVC、StorageClass讲解
    CentOS 7 安装NFS
    查看K8S的kubectl命令行缩写
    rpm&yum使用
    查看证书有效期
    kubectl-debug
    Docker镜像空间清理
    Matlab画图,坐标轴范围设置和间隔设置
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/5351497.html
Copyright © 2011-2022 走看看