在快进合并中合并冲突
Merge conflict in a fast forward merge
我有两个分支 B 和 A 。 B 是 A 的基数。 A1 是 A 的第一个提交。然后我有几个提交 A2、A3、A4 和两个合并回 B,如下所示:
B1 ---------B2----------- B3 (Branch B)
\ / /
A1----A2-----A3-----A4 (Branch A)
问题是我在将 A4 合并回 B(B3) 时遇到了合并冲突。这怎么可能 ?这应该是一个快进合并。
潜在提示
A4 是来自功能分支的提交,其历史记录为:
- 从 A2 结帐
- 做点什么
- 提交其他内容
- 合并 A(以获取最新更改,即 A3)
- 合并到 A 从而创建 A4
是否是第 4 号命令(合并 A)导致了这个问题,因为它是合并而不是变基,如果是的话怎么办?
fast-forward 合并要求一个分支的尖端是另一个分支的祖先。
如果我们查看您的图表,在合并之前:
B1 ---------B2 (Branch B)
\ /
A1----A2-----A3-----A4 (Branch A)
请注意,从B2(分支B的尖端)到A4没有向后的路径;也不存在从 A4(分支 A 的尖端)到 B2 的任何倒退路径。所以 git switch A; git merge B
; git switch B; git merge A
也不会导致 fast-forward 合并。
换句话说:如果我们将分支 A 移动到提交 B2,我们将丢失提交 A3 和 A4;如果我们将分支 B 移动到提交 A4,我们将丢失提交 B2。所以我们需要创建一个新的提交,其中 A4 和 B2 都为 parents,并将分支指针移动到它。
您甚至可以通过添加提交 B3 来亲自展示:
B1 ---------B2----------- B3 (Branch B)
\ / /
A1----A2-----A3-----A4 (Branch A)
A fast-forward 合并不会创建任何新的提交,它只是移动分支指针。例如,如果我们改为以此开头(其中 A2 的 A1 和 B2 为 parents):
B1 ----- B2 (Branch B)
\ \
A1---- A2-----A3-----A4 (Branch A)
此处,B2 是 A4 的祖先,因此 git switch B; git merge A
可以导致 fast-forward 合并,给出:
B1 ----- B2
\ \
A1---- A2-----A3-----A4 (Branch A, Branch B)
如您所说,fast-forward 合并中不可能发生冲突,因为没有应用任何更改;现有提交的标记方式只是发生了变化。但是您的合并不是 fast-forward,因此总是存在合并冲突的可能性。
我有两个分支 B 和 A 。 B 是 A 的基数。 A1 是 A 的第一个提交。然后我有几个提交 A2、A3、A4 和两个合并回 B,如下所示:
B1 ---------B2----------- B3 (Branch B)
\ / /
A1----A2-----A3-----A4 (Branch A)
问题是我在将 A4 合并回 B(B3) 时遇到了合并冲突。这怎么可能 ?这应该是一个快进合并。
潜在提示
A4 是来自功能分支的提交,其历史记录为:
- 从 A2 结帐
- 做点什么
- 提交其他内容
- 合并 A(以获取最新更改,即 A3)
- 合并到 A 从而创建 A4
是否是第 4 号命令(合并 A)导致了这个问题,因为它是合并而不是变基,如果是的话怎么办?
fast-forward 合并要求一个分支的尖端是另一个分支的祖先。
如果我们查看您的图表,在合并之前:
B1 ---------B2 (Branch B)
\ /
A1----A2-----A3-----A4 (Branch A)
请注意,从B2(分支B的尖端)到A4没有向后的路径;也不存在从 A4(分支 A 的尖端)到 B2 的任何倒退路径。所以 git switch A; git merge B
; git switch B; git merge A
也不会导致 fast-forward 合并。
换句话说:如果我们将分支 A 移动到提交 B2,我们将丢失提交 A3 和 A4;如果我们将分支 B 移动到提交 A4,我们将丢失提交 B2。所以我们需要创建一个新的提交,其中 A4 和 B2 都为 parents,并将分支指针移动到它。
您甚至可以通过添加提交 B3 来亲自展示:
B1 ---------B2----------- B3 (Branch B)
\ / /
A1----A2-----A3-----A4 (Branch A)
A fast-forward 合并不会创建任何新的提交,它只是移动分支指针。例如,如果我们改为以此开头(其中 A2 的 A1 和 B2 为 parents):
B1 ----- B2 (Branch B)
\ \
A1---- A2-----A3-----A4 (Branch A)
此处,B2 是 A4 的祖先,因此 git switch B; git merge A
可以导致 fast-forward 合并,给出:
B1 ----- B2
\ \
A1---- A2-----A3-----A4 (Branch A, Branch B)
如您所说,fast-forward 合并中不可能发生冲突,因为没有应用任何更改;现有提交的标记方式只是发生了变化。但是您的合并不是 fast-forward,因此总是存在合并冲突的可能性。