Git冲突 - 显示误报

时间:2015-06-25 12:36:27

标签: git git-merge git-merge-conflict

我遇到了一个问题,Git会在尝试合并时说文件冲突,但是当我去解决冲突时,没有冲突。为什么当本地和远程都相同时,Git认为这是一个冲突?有没有办法让Git自动解决这个问题?

操作系统:Windows 8

Git版本:1.9.5

1 个答案:

答案 0 :(得分:4)

文件肯定不一样。

当GIT检测到两个合并分支中的同一行/块以不同方式更改时,会引发冲突消息。 Git并不试图自动解决这种情况,因为解决它们很大程度上取决于文件内容的语义。 Git不知道XML,Java也不知道C#而不是ASN1语法,并且不会尝试学习它们:)这是非常基础的。

然而,对于作为程序员的人来说,一些冲突是“微不足道的”。

这就是为什么你经常使用一些外部合并实用程序,如TortoiseMerge,WinMerge,KDiff3等。那些包含一些不同的算法/启发式,这些碰巧能够自动检测/解决常见的“琐碎”冲突以同样的方式,甚至,简单地忽略为“不重要”,例如:

  • 行结束样式冲突(CR vs CRLF vs LF ..)
  • 仅限空格冲突('class Foobar' vs 'class Foobar' vs ' class Foobar'
  • 编码冲突(ASCII与UTF8对比UTF16)
  • 文件结束冲突(EOF上应该有额外的结束,而不是它)

其中一些实用程序(尤其是图形工具)可能会向您显示文件“相同”,因为它们的明显的文本内容看起来是相同的,即使原始内容的文件是不同的。这是一个偏好的问题。使用纯代码文件时,如果您的Java或C#文件保存为UTF16或UTF8通常无关紧要 - 您对代码差异感兴趣。你经常不希望看到每一行都被改变只是因为你的同事用CRLF而不是LF结尾来保存它。

但有三个重要的注意事项:

  1. 在这种情况下,一个好的文件合并器会通知你“文件是否相同”,但是“文件内容相同,但文件不是二进制相等”;例如,KDiff3就是这样做的。
  2. whitespaces / lineendings / encodings / etc似乎并不重要,但事实并非如此。以Makefiles或Python为例。如果有一个空格或三个或一个标签,那就有很大差异。
  3. 因此,忽略白色/编码/等严格依赖于文件的用法。在C#编码中可能不重要,在FooBar中它可能很重要。这就是GIT不试图对这种碰撞进行任何自动处理的原因。 Git玩得很安全。您选择的文件差异或文件合并为您做了这些并“欺骗”您认为文件是相同的。