Git中的合并是否对称?

Eya*_*yal 37 git merge git-merge branching-and-merging symmetry

假设我们有两个分支(BC),它们与共同的祖先A不同.从BC的合并会产生与从CB合并相同的结果吗?

  A
  |
 / \
B   C
Run Code Online (Sandbox Code Playgroud)

澄清 - 我假设任何手动合并冲突解决方案都会在两个方向上发生.但是,任何自动合并都会导致选择相同的代码吗?这就是我所假设的,因为提交日期在两个方向上都是相同的.

为了进一步澄清 - 我知道实际的合并会导致基于方向的彼此的"镜像".我只是询问自动解决的冲突.

Chr*_*her 24

对于默认合并,答案是肯定的.三向合并找到一个共同的祖先,然后应用两边的差异,这是一种不依赖于顺序的操作.合并排序和交换的主题在git列表上产生了一个引人入胜的讨论(如果你是这样的话,那就是).注意B into CC into B应该是对称的,但同样可以不一定是说(B into C) into AB into (C into A).


更详细地说明了一点,基于以下文斯的评论和对问题的SEH的评论,会有之间有两个明显的差异B into CC into B,这两者都不影响问题所引用的自动合并决议.

首先,历史将是不同的.合并提交的父项将根据合并顺序进行更改.对于这些示例,我将使用"first_branch"和"second_branch",因此我可以保留字母来表示提交.

git checkout first_branch && git merge second_branch

E <- merge commit
|\
| D <- second_branch's tip
| |
| C <- another commit on second_branch 
| |
| B <- and another
|/
A <- first_branch's tip before the merge
Run Code Online (Sandbox Code Playgroud)

在这种情况下,E的"第一个父" E^1是合并前的first_branch的提示.second_branch是合并提交的"第二个父",也就是说E^2.现在考虑相反:

git checkout second_branch && git merge first_branch

E <- merge commit
|\
| D <- first_branch's tip
| |
| C <- another commit on first_branch 
| |
| B <- and another
|/
A <- second_branch's tip before the merge
Run Code Online (Sandbox Code Playgroud)

父母被逆转了.E^1是合并前second_branch的提示.E^2是first_branch的提示.

其次,冲突的显示顺序将会逆转.在第一种情况下,冲突可能如下所示:

<<<<<<< HEAD
This line was added from the first_branch branch.
=======
This line was added from the second_branch branch.
>>>>>>> second_branch
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,同样的冲突看起来像这样:

<<<<<<< HEAD
This line was added from the second_branch branch.
=======
This line was added from the first_branch branch.
>>>>>>> first_branch
Run Code Online (Sandbox Code Playgroud)

这些差异都不会影响自动合并分辨率,但是当您反转三向合并顺序时它们会出现.


twa*_*erg 6

这取决于你所说的“相同的结果”是什么意思。从内容的角度来看,假设没有冲突,或者所有现有冲突都以完全相同的方式精心解决,则生成的新合并提交的内容应该是相同的。

然而,从历史拓扑的角度来看,两者有很大不同。如果您位于分支 B 并在 C 中合并,则 B 的 HEAD 会移动以指向合并提交,但 C 仍保持在原来的位置。相反,如果你在 C 上并合并到 B 上,则 C 的 HEAD 会移动,而 B 的 HEAD 则保持在原处。因此,最终的拓扑非常不同,这对任一分支的未来开发都有影响,即使新提交的内容在这两种情况下都是相同的。