假设我们有两个分支(B和C),它们已经从共同的祖先A分叉了。从B合并到C会产生与从C到B合并相同的结果吗?
A
|
/ \
B C
澄清一下- 我假设任何手动合并冲突的解决方案都会在两个方向上发生。但是,任何自动合并是否会导致选择相同的代码?这是我假设的,因为提交日期在两个方向上都是相同的。
进一步澄清- 我知道实际合并会基于方向产生"镜像" 。我只是询问自动解决的冲突。
A
|
/ \
B C
澄清一下- 我假设任何手动合并冲突的解决方案都会在两个方向上发生。但是,任何自动合并是否会导致选择相同的代码?这是我假设的,因为提交日期在两个方向上都是相同的。
进一步澄清- 我知道实际合并会基于方向产生"镜像" 。我只是询问自动解决的冲突。
B into C
和C into B
应该是对称的,但不能保证(B into C) into A
与B into (C into A)
相同。
[编辑注,2020年4月:如果添加像-X ours
或-X theirs
这样的选项,则答案变为“否”,请参见twalberg's answer和其他附加警告。]
B into C
和C into B
之间将会有两个明显的区别,两者都不会影响问题中提到的自动合并解决方案。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
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
E^1
是第二分支的顶端。E^2
是第一分支的顶端。<<<<<<< HEAD
This line was added from the first_branch branch.
=======
This line was added from the second_branch branch.
>>>>>>> second_branch
<<<<<<< HEAD
This line was added from the second_branch branch.
=======
This line was added from the first_branch branch.
>>>>>>> first_branch
这些差异不会影响自动合并解决,但在反转三方合并顺序时会出现。
- Vincetheirs:sample.txt`?还是其中之一被选择了,哪一个呢?
git checkout b
git merge c
git checkout c
git merge b
编辑:
另一个区别是,如果您稍后执行git reset [--hard] HEAD~{n}
来回滚一些提交,而这个操作超过了合并点,则返回的分支取决于您进行的合并,始终是您合并到的分支(在上面的示例中被检出的分支)。
不,我认为它不会对称。首先,您可以设置合并策略选项,特别是在您的情况下,theirs
或ours
,这将确定选择B还是C。
在自动合并中,例如,如果您正在将远程分支合并到自己的分支中,则远程分支优先于您的更改,这意味着从B调用git merge C
将导致选择C的更改。但我不是100%确定,所以您可以自己尝试并让我们知道结果。
git merge -s<strategy> -X<option>
。 - Vince