Git 合并冲突 - “以不同方式更改同一文件的相同部分”是什么意思?

Sim*_*aya 6 git version-control

Git 书的第 3.2 章指出:

\n\n
\n

…有时,这个过程并不顺利。如果您在要合并的两个分支中对同一文件的相同部分进行了不同的更改,Git 将无法干净地合并它们。...

\n
\n\n

不明确的“以不同方式更改同一文件的相同部分”表达式应该如何解释?Git 内部是否在跨分支的冲突文件中执行逐行比较?

\n\n
\n\n

例子

\n\n

假设在分支L上,我在 README.md 的开头添加了一个额外的换行符。这是否意味着对其他分支R上的 README.md 的第一行进行的修改会在合并时触发冲突?

\n\n

您可能会认为天真的逐行比较会失败,因为L中的所有行都已移动了一个位置,而R中的某些行保持不变。

\n

tor*_*rek 3

请记住,Git 所做的不是一项差异,而是两项差异:

\n\n
    \n
  • 有一个包含一些文件的合并基础提交B
  • \n
  • 以及包含一些文件的左侧L提交,
  • \n
  • 以及包含一些文件的右侧R提交。
  • \n
\n\n

两个命令中的合并基B是相同的: git diff

\n\n
git diff --find-renames <hash-of-B> <hash-of-L>    # what we changed\ngit diff --find-renames <hash-of-B> <hash-of-R>    # what they changed\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以,假设我们和他们都修改了 file F.ext从第一个diff 中可以清楚地看出F.ext 我们更改了哪些行:关于 B 的 diff 块中列出的已删除的行,再加上边缘处的一条“中间”线以确保安全\xe2\x80\x94边缘向前移动,因此,如果我们替换原来的第 3 行,我们就“触及”了第 3 行和“3 行半”。如果我们没有删除任何行\xe2\x80\x94,如果我们在第3行之后、第4行之前插入一行\xe2\x80\x94,那么我们就触及了“3半”行。

\n\n

同时,从第二个差异中也可以清楚地看出F.ext 它们的哪些行发生了变化。同样的规则适用:如果他们用替换的第 3 行替换了原始的第 3 行,那么他们就触及了第 3 行(包括“3.5”行)。因此,如果我们触及第 3 行或第 3.5 行,就会发生冲突。否则,就不存在冲突:Git 可以从对相关行进行更改的一方获取更改。

\n\n

(请注意,将git diff差异呈现为统一上下文差异。合并代码使用原始的、非统一的差异。因此,它有一个列表,其中显示“在原始的X行,删除D行并插入的替换行”,其中DI最多可以为零。所触及的跨度是X线到X + D + 0.5线,或多或少。用我奇怪的“加半”,我真的只是在这里用力挥手来掩盖空跨度问题,这一个问题。你必须用 Git 进行实验才能确切地了解它在每种情况下的作用。)

\n