为什么git将此文本文件视为二进制文件并且无法提供有意义的差异?

时间:2015-03-03 16:32:48

标签: git

在Pluralsight上进行git课程的介绍,git并没有与diff部分合作。

操作系统是Windows 8.1。我试图在没有特殊字符的情况下对两个版本的文本文件进行区分。我通过以下方法在PowerShell中创建了这个文本文件:

echo "Hello, world" > readme.txt

Regular diff命令表示二进制文件不同。

PS C:\GitTest> git diff HEAD~1..HEAD
diff --git a/readme.txt b/readme.txt
index 440580d..0d6852b 100644
Binary files a/readme.txt and b/readme.txt differ

当我用--text强制它时,我得到这个输出:

PS C:\GitTest> git diff --text HEAD~1..HEAD
diff --git a/readme.txt b/readme.txt
index 83f0e87..fef1216 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
-ÿþH-\ No newline at end of file
+ÿþH++\ No newline at end of file

不确定为什么它首先认为它是二元的,或者为什么上面的差异似乎无用。该文件的两个版本如下所示:

HEAD〜1:

Hello, Git!
Hello, again!
Hello, for the last time!

HEAD:

Hello, Git!
Hello, again!
Hello, for the last time!
Hello, again I hope this really is the last time...

我的编辑器正在使用CRLF,但我已将git设置为core.autocrlf = true。我确保HEAD和HEAD~1版本在文件末尾都有换行符。

enter image description here

我觉得我可能错过了一些简单的东西 - 它是什么?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

diff中的前两个字符(带有点和y的y)是字节0xFF0xFE的Latin-1解释。如果这些字节被解释为UCS2 / UTF16,则它们是小端字节顺序标记。在那些字节之后,你得到的是" Hello,world"然后可能是一个导致强制文本模式差异放弃的NUL。

因此,您的文本编辑器已将文件保存为UTF16LE格式,这在Windows中很常见,但在unix世界中很少见,git来自。这就是git混淆的原因。

如果您可以告诉编辑器将文件保存为UTF8(或其他一些8位编码),那么它将与git相处得更好。或者您可能希望看到this question关于git的配置选项,以使其更好地使用UTF16文件。