Answers:
它表示'\n'
文件末尾没有换行符(通常为CR或CRLF)。
也就是说,简单地说,文件中的最后一个字节(或字节,如果您使用的是Windows)不是换行符。
之所以显示该消息,是因为否则无法分辨出文件末尾有换行,而文件末尾没有换行。Diff无论如何都必须输出换行符,否则结果将更难于自动读取或处理。
请注意,如果文件格式允许,总是将换行符放在最后一个字符是一种很好的样式。此外,例如,对于C和C ++头文件,语言标准是必需的。
这不仅是不良的样式,而且在文件上使用其他工具时,可能会导致意外的行为。
这里是test.txt
:
first line
second line
最后一行没有换行符。让我们看看文件中有多少行:
$ wc -l test.txt
1 test.txt
也许这就是您想要的,但是在大多数情况下,您可能希望文件中有2行。
另外,如果您要合并文件,则可能无法达到预期的效果:
$ cat test.txt test.txt
first line
second linefirst line
second line
最后,如果要添加新行,这会使您的差异变得更加嘈杂。如果添加了第三行,它将显示对第二行以及新添加的内容的编辑。
唯一的原因是,Unix历史上一直以所有以可读行结尾的人类可读文本文件为惯例。当时,这避免了在显示或加入文本文件时进行额外的处理,并且避免了将文本文件与包含其他类型数据(例如,人类无法读取的原始二进制数据)的文件区别对待。
由于这个约定,那个时代的许多工具都希望结尾的换行符,包括文本编辑器,差异工具和其他文本处理工具。Mac OS X是在BSD Unix上构建的,而Linux已开发为与Unix兼容的,因此两种操作系统都继承了相同的约定,行为和工具。
Windows尚未开发为与Unix兼容,因此它没有相同的约定,并且大多数Windows软件都可以很好地处理而没有尾随换行符。
但是,由于Git首先是为Linux开发的,并且许多开放源代码软件都是在与Unix兼容的系统上构建的,例如Linux,Mac OS X,FreeBSD等,因此大多数开放源代码社区及其工具(包括编程语言)仍在继续遵守这些约定。
有许多技术原因在1971年才有意义,但在这个时代,这主要是惯例并保持与现有工具的兼容性。
如果您在现有文件的末尾添加新的文本行,但末尾没有newline character
,则diff将显示旧的最后一行已被修改,即使从概念上讲不是。
这至少是newline character
在末尾添加a的一个很好的理由。
文件包含:
A() {
// do something
}
十六进制转储:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d something.}
您现在将其编辑为
A() {
// do something
}
// Useful comment
十六进制转储:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d0a 2f2f 2055 something.}.// U
00000020: 7365 6675 6c20 636f 6d6d 656e 742e 0a seful comment..
git diff将显示:
-}
\ No newline at end of file
+}
+// Useful comment.
换句话说,它显示出比概念上更大的差异。它显示您删除了该行}
并添加了该行}\n
。实际上,这是发生的事情,但从概念上讲不是发生的事情,因此可能会造成混淆。
之所以采用这种约定,是因为在类似UNIX的操作系统上,换行符被视为行终止符和/或消息边界(这包括进程之间的管道,行缓冲等)。
例如,考虑将只有换行符的文件视为空行。相反,长度为零字节的文件实际上是具有零行的空文件。可以根据wc -l
命令确认。
总之,此行为是合理的,因为如果\n
字符只是行分隔符而不是行终止符,则没有其他方法可以区分空文本文件和具有单个空行的文本文件。因此,有效的文本文件应始终以换行符结尾。唯一的例外是如果文本文件打算为空(无行)。
我在以前的回复中没有看到一件事。当文件的一部分被截断时,没有行尾的警告可能是警告。这可能是数据丢失的症状。
实际上,这确实会引起问题,因为行尾会自动修改为脏文件,而无需对其进行任何更改。请参阅此帖子以获取解决方法。
您的原始文件可能没有换行符。
但是,某些编辑器(如linux中的gedit)会在文件末尾静默添加换行符。使用这种编辑器时,您不会摆脱此消息。
我试图克服的问题是使用Visual Studio代码编辑器打开文件
该编辑器清楚地显示了最后一行,您可以根据需要删除该行。