Git merge"重播"变化,但它呢?

时间:2017-07-28 18:49:20

标签: git merge

git merge文档说明了这个例子:

      A---B---C topic
     /
D---E---F---G master
  

然后" git合并主题"将重播在主题分支上所做的更改,因为它从master(即E)分离到master之上的当前提交(C),并将结果记录在新提交中以及两个父提交的名称和a来自描述更改的用户的日志消息。

我想知道短语"重播变化。"我几乎找不到提及“#34;重播"在其他关于git合并的文章中。

我想git找到A和合并库之间的变化,应用该更改,应用B和A之间的差异,应用C和B之间的差异,然后将该系列更改合并到合并提交中。基本上在合并基础之后查看每个提交并单独评估它们。

如果这是真的,那么......的情况会发生什么。

      A---B---C---I topic
     /         \
D---E---F---G---H(merge)---O master

我希望将master合并到主题中。假设当前分支是主题," git merge master 。"我的合并基础是" git merge-base主题"提交 C

如果我们坚持"重播"更改,主题分支如何获得提交F和G的更改?是否找到了H和C(合并基础)之间的差异?如果是这样,为什么要重放第一个例子中的一系列更改,而只是找到分支头和合并基础之间的差异?

2 个答案:

答案 0 :(得分:3)

他们在这里使用的描述只是:描述性。但它真的没有错。

从技术上讲,git正好看三个提交:“我们的”,“他们的”和“合并基础”。合并基础和“他们的”之间的变化适用于“我们的”,只要它们不与合并基础和“我们的”之间的任何变化冲突。该文档将此描述为“重播”更改。它并不意味着在整个过程中检查每个提交(la rebase )。

从这个角度来看,你的第二个例子很简单:基数是C,“他们的”是HCH之间的差异是计算出来的那些更改已应用(“重播”)到I

答案 1 :(得分:2)

我认为“重播”这个词是不好的术语:

  

我想git找到A和合并基础之间的变化,应用该更改,在B和A之间应用差异,在C和B之间应用差异,然后将该系列更改合并到合并提交中。

这是解释措辞的合理方式。

这不是Git所做的。

结论:措词很差。

Git 做的是找到合并库 1 ,然后从该提交计算差异到两个 2 提交合并,每个这样的提交一个差异。这些差异有效地“跳过”了所有中间工作。

1 假设图中有一个最低的共同祖先,即。如果有多个LCA候选人,下一步取决于合并策略。

-s recursive(默认)策略通过合并它们并进行新的临时提交来处理多个合并基础(两个或更多个LCA)。它通过递归调用自身来进行合并,因此名称为“递归”。 -s resolve策略通过任意选择一个合并库并继续进行处理多个合并库,就像只有一个合并库一样。

2 两个或两个以上,实际上,除了只有某些合并策略处理两个以上的头。具体来说,-s ours策略可以使用任意数量的头 - 但它忽略除了当前头之外的所有头,这意味着它进行合并提交(合并为名词/形容词)而不进行任何合并工作(合并为动词)。 -s octopus策略也可以处理两个以上的头,但是比双头策略更有限。