为什么当相邻行发生更改时,git 会产生合并冲突?

31

假设我有一个文件,它的内容在master分支中:

Line 1
Line 2
Line 3
Line 4

现在假设我创建并检出了一个名为 test 的新分支。在这个分支中,我将文件更改为:

Line 1
Line 2
Line 3 Modified
Line 4

然后我提交更改,并切换回 master 分支。在 master 分支中,我将文件更改为:

and I commit this and switch back to master. In master I change the file to:

Line 1
Line 2
Line 3
Line 4 Modified

我已经提交更改。如果我将分支test合并到master,会产生冲突。

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

这在我们公司是一个问题,因为有些文件中多个开发人员在相近的位置更改行,这会导致很多不必要的冲突。


这个回答解决了你的问题吗?什么时候会出现 Git 合并冲突 - mkrieger1
3个回答

27
Git为什么会这样行动的原因在回答这个问题中得到了很好的解释:https://softwareengineering.stackexchange.com/questions/194788/why-doesnt-git-merge-adjacent-lines-without-conflict/378258#378258。换言之,因为你需要相邻的行提供变更的上下文(你不能只使用行号,因为上面可能已经添加或删除了某些内容),如果周围的行已经改变,你通常不希望Git继续进行合并。用户Arsen7在该主题中给出了一个如何搞砸的好例子。然而,我同意你的看法,有时这确实很让人恼火,所以我编写了一个自定义合并驱动程序,在合并/变基过程中可以解决此类冲突。它被设计成交互式的,因为我总是想先检查它是否会做正确的事情,但如果你有信心它会工作,你可以很容易地修改它。如果你感兴趣,这个脚本在GitHub上以GPLv3+许可证的形式可用: https://github.com/paulaltin/git-subline-merge

2
哇,那个问题几乎和我的一模一样 :) 我之前发帖时居然没找到它。谢谢,我会看看你的脚本。 - Falconne
1
不用担心,希望对你有用。如果您需要修改以适应您的需求,请告诉我。 - deltacrux
2
另外,如果这个答案(或其他任何答案)对您有用,请考虑给它们中的一个点赞和/或接受其中之一。 - deltacrux
git-subline-merge对于追加的行有帮助吗?我们有一个文件,会添加条目,而添加的顺序很少有影响(通过不同的错误提交)。 - Joe Casadonte
@JoeCasadonte - 很遗憾,它并不是为此而设计的,它旨在解决位于同一行或相邻行上的明确冲突。听起来你可能对合并联合感兴趣? - deltacrux

1
我遇到了同样的问题,从SVN来看,我也觉得这很奇怪。
我不知道为什么会这样,但或许以下内容可以帮助你:
我使用另一个合并工具(取决于你使用的操作系统),我在linux / ubuntu上使用meld diff来解决合并冲突。
你也可以设置git使用这个外部合并应用程序……
参见http://meldmerge.org/ 然后搜索“使用meld for git”
例如http://meldmerge.org/help/resolving-conflicts.html

3
谢谢回复。我们已经使用了各种外部合并工具来处理Git的代码合并,它们可以自动解决这些附近的冲突。但是我希望找到一种方法来阻止Git在第一时间就暂停合并这种非冲突情况,因为这种情况发生得太频繁了,让人感到很烦恼。 - Falconne
完全同意!(我对其他的回复/解决方案很感兴趣...)。另一个令人烦恼的事情是行末标识符...如果有开发者在不同的操作系统上工作,例如Windows和Ubuntu编辑器,则它们对于行末标识符的处理方式是不同的...这会导致很多合并冲突。 - michel.iamit

0

您可以在存储库中的.gitattributes文件中指定一个自定义合并驱动程序,在这种情况下不会发生冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接