为什么当彼此相邻的行发生变化时,git会产生合并冲突?

Fal*_*nne 7 git merge

假设我有一个包含此内容的文件master:

Line 1
Line 2
Line 3
Line 4
Run Code Online (Sandbox Code Playgroud)

现在说我创建并签出一个名为的新分支test.在这个分支中,我将文件更改为:

Line 1
Line 2
Line 3 Modified
Line 4
Run Code Online (Sandbox Code Playgroud)

我提交了这个并切换回来master.在master中我将文件更改为:

Line 1
Line 2
Line 3
Line 4 Modified
Run Code Online (Sandbox Code Playgroud)

我承诺 现在,如果我合并分支testmaster,我遇到冲突.

为什么不能使用共同的祖先git自动解决这个问题?如果我告诉git使用BeyondCompare作为difftool编辑冲突,BeyondCompare甚至不会告诉用户自动解决这个问题,因为这不是真正的冲突.有没有办法让git自动解决这些问题?我已经尝试过recursiveresolve合并策略,但都没有.

这是我们公司的一个问题,因为有些文件中有多个开发人员在近距离内更换线路,这会导致许多不必要的冲突.

del*_*rux 13

Git 行为如此的原因在这个问题的答案中得到了很好的解释:

https://softwareengineering.stackexchange.com/questions/194788/why-doesnt-git-merge-adjacent-lines-without-conflict/378258#378258

本质上,因为您需要相邻的行来为更改提供上下文(您不能只使用行号,因为上面可能已添加或删除了某些内容),如果它周围的行发生了更改,您通常不希望 Git只是天真地继续合并。用户 Arsen7 在该线程中给出了一个很好的例子,说明这可能会如何严重错误。

但是,我同意您的看法,有时这很烦人,因此我编写了一个自定义合并驱动程序,可以在合并/重新定位期间解决此类冲突。它被设计为交互式的,因为我总是想在继续之前检查它是否会做正确的事情,但是如果您确信它会起作用,您可以轻松地将其修改为不正确。

如果您有兴趣,可以在 GPLv3+ 许可下在 GitHub 上获得该脚本:

https://github.com/paulaltin/git-subline-merge

  • 哇,这个问题的构造几乎和我的一模一样:)在发布我的问题之前,我在搜索它时没有找到它。谢谢,我会看一下你的剧本。 (2认同)
  • 另外,如果这个答案(或任何其他答案)有用,请考虑投票和/或接受其中一个。 (2认同)

mic*_*mit 1

我偶然发现了同样的问题,来自 SVN 我也发现这很奇怪。

我没有答案,但也许这有帮助:

我使用另一个合并工具(取决于您正在使用的操作系统),我使用 meld diff 来解决合并冲突(我在 linux / ubuntu 上工作)。

您也可以将 git 设置为使用此外部合并应用程序......

请参阅http://meldmerge.org/

和谷歌搜索“使用 meld for git”

例如http://meldmerge.org/help/resolving-conflicts.html

  • 谢谢回复。我们已经为 git 使用了各种外部合并工具,它们会自行解决这些邻近冲突。然而,我正在寻找一种方法来阻止 git merge 首先暂停在这样的非冲突上,因为它经常发生,很烦人。 (3认同)