cherry-pick,revert和rebase使用的3-way合并策略

Posted chaoguo1234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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移除。

 

以上是关于cherry-pick,revert和rebase使用的3-way合并策略的主要内容,如果未能解决你的问题,请参考以下文章

Git Cherry-Pick 和 Git Revert 有啥区别? [关闭]

如何用git reflog和git cherry-pick找回已删除的commit记录

Merge,Rebase,Cherry-Pick 一文解惑

Git应用详解第九讲:Git cherry-pick与Git rebase

Git应用详解第九讲:Git cherry-pick与Git rebase

git 四个基本对象分支三个存储区reset-revert-变基cherry-pick