回答:
'\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
最後に、新しい行を追加する場合は、差分のノイズが少し大きくなります。3行目を追加した場合、2行目の編集と新しい追加が表示されます。
唯一の理由は、Unixには歴史的に、改行で終わるすべての人間が読めるテキストファイルの規則があったためです。当時、これにより、テキストファイルの表示または結合時の余分な処理が回避され、テキストファイルを他の種類のデータ(たとえば、人間が読めない生のバイナリデータ)を含むファイルとは異なる方法で処理することが回避されました。
この規則により、その時代の多くのツールは、テキストエディタ、差分ツール、その他のテキスト処理ツールなど、改行の終了を期待しています。Mac OS XはBSD Unix上に構築され、LinuxはUnix互換になるように開発されたため、両方のオペレーティングシステムが同じ規則、動作、およびツールを継承しています。
WindowsはUnix互換になるように開発されていないため、同じ規則はありません。ほとんどのWindowsソフトウェアは、末尾の改行がなくても問題なく処理できます。
しかし、Gitは最初にLinux用に開発され、多くのオープンソースソフトウェアがLinux、Mac OS X、FreeBSDなどのUnix互換システム上に構築されているため、ほとんどのオープンソースコミュニティとそのツール(プログラミング言語を含む)は継続しますこれらの慣習に従ってください。
1971年に理にかなっている技術的な理由がありますが、この時代では、ほとんどが慣習であり、既存のツールとの互換性を維持しています。
末尾にaがない既存のファイルの末尾に新しいテキスト行を追加するとnewline character
、概念的に変更されていなくても、差分は古い最後の行を変更されたものとして表示します。
これは、少なくとも1つの newline character
、最後にです。
ファイルには以下が含まれます:
A() {
// do something
}
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d something.}
これを編集して
A() {
// do something
}
// Useful comment
Hexdump:
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
文字が行ターミネータではなく単に行セパレータである場合、空のテキストファイルと1つの空の行があるテキストファイルを区別する他の方法がないため、この動作は完全に妥当です。したがって、有効なテキストファイルは常に改行文字で終わる必要があります。唯一の例外は、テキストファイルを空にする(行がない)場合です。
これは実際には問題を引き起こします。行末は、ファイルを変更せずに自動的に変更されてダーティファイルになるためです。解決策については、この投稿を参照してください。
ソースファイルは多くの場合、ツール(C、C ++:ヘッダーファイル、Javascript:バンドル)によって連結されます。改行文字を省略すると、厄介なバグが発生する可能性があります(あるソースの最後の行が次のソースファイルの最初の行と連結される)。うまくいけば、そこにあるすべてのソースコード連結ツールがとにかく連結されたファイルの間に改行を挿入しますが、常にそうであるとは限りません。
問題の核心は-ほとんどの言語で、改行には意味的な意味があり、ファイルの終わりは改行文字の言語定義の代替ではありません。したがって、最後の文字を含め、すべてのステートメント/式を改行文字で終了する必要があります。
//
、コードの途中でスタイルのコメントを。
元のファイルにはおそらく改行文字がありませんでした。
ただし、geditなどの一部のエディター Linuxのは、ファイルの最後に改行を静かに追加します。この種のエディタを使用している間は、このメッセージを取り除くことはできません。
この問題を克服しようとしたのは、ビジュアルスタジオコードエディターでファイルを開くことです
このエディタは最後の行を明確に示し、必要に応じてその行を削除できます。