No newline at end of file
It indicates that you do not have a newline (usually '\n'
, aka CR or CRLF) at the end of file.
That is, simply speaking, the last byte (or bytes if you're on Windows) in the file is not a newline.
The message is displayed because otherwise there is no way to tell the difference between a file where there is a newline at the end and one where is not. Diff has to output a newline anyway, or the result would be harder to read or process automatically.
Note that it is a good style to always put the newline as a last character if it is allowed by the file format. Furthermore, for example, for C and C++ header files it is required by the language standard.
It's not just bad style, it can lead to unexpected behavior when using other tools on the file.
Here is test.txt
:
first line
second line
There is no newline character on the last line. Let's see how many lines are in the file:
$ wc -l test.txt
1 test.txt
Maybe that's what you want, but in most cases you'd probably expect there to be 2 lines in the file.
Also, if you wanted to combine files it may not behave the way you'd expect:
$ cat test.txt test.txt
first line
second linefirst line
second line
Finally, it would make your diffs slightly more noisy if you were to add a new line. If you added a third line, it would show an edit to the second line as well as the new addition.
The only reason is that Unix historically had a convention of all human-readable text files ending in a newline. At the time, this avoided extra processing when displaying or joining text files, and avoided treating text files differently to files containing other kinds of data (eg raw binary data which isn't human-readable).
Because of this convention, many tools from that era expect the ending newline, including text editors, diffing tools, and other text processing tools. Mac OS X was built on BSD Unix, and Linux was developed to be Unix-compatible, so both operating systems have inherited the same convention, behaviour and tools.
Windows wasn't developed to be Unix-compatible, so it doesn't have the same convention, and most Windows software will deal just fine with no trailing newline.
But, since Git was developed for Linux first, and a lot of open-source software is built on Unix-compatible systems like Linux, Mac OS X, FreeBSD, etc, most open-source communities and their tools (including programming languages) continue to follow these conventions.
There are technical reasons which made sense in 1971, but in this era it's mostly convention and maintaining compatibility with existing tools.