3

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

操作系统:Windows 8

Git 版本:1.9.5

4

1 回答 1

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 vs UTF8 vs UTF16)
  • 文件结尾冲突(EOF 上应该有额外的结束行而不是没有)
  • 等等

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

三个重要的注意事项:

  1. 在这种情况下,一个好的文件合并器不会通知您“文件相同”,而是“文件内容相同,但文件二进制不相等”;例如,KDiff3 就是这样做的。
  2. 空格/lineendings/encodings/etc 可能看起来并不重要,但事实并非如此。以 Makefile 或 Python 为例。如果有一个空格或三个或一个制表符,会有很大的不同。
  3. 因此,忽略 whites/encoding/etc 严格依赖于文件的使用。在 C# 编码中可能无关紧要,在 FooBar 中可能很重要。这就是为什么 GIT 不会尝试对此类冲突进行任何自动处理。Git 很安全。您选择的文件差异或文件合并为您做到了这一点,并“欺骗”您认为文件是相同的。
于 2015-06-25T12:59:53.137 回答