在快进合并中合并冲突

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 是来自功能分支的提交,其历史记录为:

  1. 从 A2 结帐
  2. 做点什么
  3. 提交其他内容
  4. 合并 A(以获取最新更改,即 A3)
  5. 合并到 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,因此总是存在合并冲突的可能性。