Diffでの「ファイル末尾に改行なし」の処理

Unified Diffの特殊マーカー「\\ No newline at end of file」を理解し、パッチ適用への影響を学びます。

Unified Diff Format

詳細な説明

「ファイル末尾に改行なし」マーカー

ファイルが改行文字で終わらない場合、Unified Diffには特殊なマーカーが含まれます:\\ No newline at end of file。このマーカーはDiff内のファイルの最終行の直後に表示され、+-、またはスペースのプレフィックスは付きません。

Diffの例

--- a/config.txt
+++ b/config.txt
@@ -1,3 +1,3 @@
 setting1=true
 setting2=false
-setting3=old
\ No newline at end of file
+setting3=new
\ No newline at end of file

意味

  • オリジナルファイルはsetting3=oldで終わり、末尾改行なし
  • 変更後ファイルはsetting3=newで終わり、同様に末尾改行なし
  • このマーカーなしでは、ファイルが改行で終わるかどうかが曖昧

なぜ重要か

ほとんどのテキストエディタは自動的に末尾改行を追加しますが、設定ファイル、圧縮コード、バイナリをテキスト化したファイルには末尾改行がないことがあります。マーカーにより:

  1. 往復の正確性 — パッチの適用と逆適用で正確なオリジナルが再現される
  2. 無言の破損防止 — マーカーなしでは改行が意図せず追加・削除される可能性がある
  3. Git互換性 — Gitは必要な場合常にこのマーカーを生成

Diffパッチ適用ツールでの処理

ツールはこのマーカーを適切に処理します。パッチ解析時に\\行は認識されスキップされます。

ユースケース

圧縮JavaScriptファイルや意図的に末尾改行のない設定ファイルにパッチを適用しています。このマーカーを理解することで、Diffで見かけた際の混乱を防げます。

試してみる — Diff Patch Applier

フルツールを開く