git上更智能的冲突解决方案

时间:2014-05-26 21:58:55

标签: git version-control merge merge-conflict-resolution

有时候我对合并的结果感到有点失望,git似乎无法自动解决简单的冲突,所以我认为必定会有一些我缺失的东西,错误的设置或者可能在那里&#39 ;一种配置git的方式更多"积极的"解决冲突。

例如,我将我的合并工具(P4Merge)的这张图片添加了冲突:

enter image description here

更大的版本here

左侧的文件修改了两条原始(中心)线。右边的文件只是在两条原始行之间添加了一行。

他们是完全独立的变化,但因为他们在某种程度上在一起git引发冲突。

很容易想象这会是一个真正的冲突,但大多数时候我认为它会产生一个我更喜欢修复而不是合并冲突的编译错误。 / p>

我将我的合并工具配置为忽略行结尾和所有空白区域差异,我有autocrlf = true,但也许git在合并时不会忽略空白区域差异,并且会出现这样的哑巴冲突。有没有办法调整git如何处理冲突解决?

3 个答案:

答案 0 :(得分:1)

我不认为有任何系统基本上可以忽略冲突(虽然如果您在合并时没有解决冲突,svn会将冲突文件中的两个更改留下来,所以你有一个文件其中有差异标记)

鉴于你想要在之后解决冲突,是否可以配置git来做同样的事情 - 即忽略冲突。

我说这不是你真正想要做的事情,冲突应该立即得到解决,因为你永远不会知道代码会引发编译错误,如果你有些改变不会别理他们。当你可以看到双方时,最好在合并时修复它们。

答案 1 :(得分:1)

  

很容易想象这将是一场真正的冲突

你是对的。无论你对两条原始线做出什么改变,都可能需要对它们之间添加的线进行。

<<<<<<<<<<<<<
    if ( g->tag == mark 
      || g->tag == error ) {
||||||||||||||
    if ( tag == mark
      || tag == error ) {
==============
    if ( tag == mark 
      || tag == release
      || tag == error ) {
>>>>>>>>>>>>>>

我怀疑会自动合并这些工具的工具,即使99%的情况下这是正确的事情。

您可以重播合并的长历史并比较性能,显示您的automerge产生与普通automerge不同的结果。这不应该太难,在一次传递中保存冲突的文件,然后猜测两次差异。

答案 2 :(得分:0)

我看到你以两种不同的方式修改了相同的文本块。这就是冲突。您可以尝试使用git mergetool -y -t mymagicmergetool并使用魔法冲突解决工具自动解决所有冲突。