为什么 git 将两个单独的已删除行标记为冲突?

Why is git marking two separate deleted lines as conflict?

我有一个包含以下内容的文件:

line 1
line 2
line 3
line 4

在分支 A 上提交。

据此,我创建了一个分支 B 并删除了提交中的第三行。 我签出分支 A 并删除另一个提交中的第二行。

当我在分支 A 中合并分支 B 时,我在该文件中遇到这样的冲突:

line 1
<<<<<<< HEAD
line 2
=======
line 3
>>>>>>> B
line 4

1) 如果没有修改同一行,为什么会发生冲突? 2) 为什么会这样显示而不是:

line 1
<<<<<<< HEAD
=======
>>>>>>> B
line 4

更清楚地表明那些行已被删除?

为了确保它不会破坏任何东西,任何体面的 diff 程序还会跟踪至少两行上下文:一行在 added/modified/deleted 行之上和之下。

当你删除分支B上的第3行时,实际上你修改了第2-4行的块。类似地,在分支 A 上,您修改第 1-3 行的块。

这两个块重叠,它们引入了不同的变化。 Git 无法确定如何合并这些更改,这就是将它们标记为冲突的原因。

B分支的文件内容为:

line 1
line 2
line 4

但是在当前分支(分支A)上是:

line 1
line 3
line 4

哪个是“正确”的版本?合并后你期望得到什么? Git 说不出来。 说不出来。只有你自己知道。

如何读取Git报告的冲突区域:

line 1
<<<<<<< HEAD
line 2
=======
line 3
>>>>>>> B
line 4

用简单的英语来说,上面的块说:“在 line 1line 4 之间,当前分支上有 line 2,但分支 B 上有 line 3”。

您建议的区块:

line 1
<<<<<<< HEAD
=======
>>>>>>> B
line 4

表示:在两个分支上,line 1line 4之间没有任何内容。这不是真的。

你永远不会在 diff 中遇到这样的块。这基本上意味着文件的比较版本之间没有冲突。