guide/read-unified-diff.md

unified diff(patch)の読み方 — コードレビューのための手引き

git diff や patch ファイルの --- +++ ヘッダー、@@ ハンクヘッダーの数字、文脈行、No newline at end of file の表示、diff --git 拡張ヘッダーを例とともに1つずつ読み解きます。

最終更新: 2026-09-23

コードレビューや不具合報告、メールでやり取りされるパッチの多くは unified diff 形式です。git diffdiff -u、GitHub の「raw diff」はどれもこの形式を使います。最初は記号が多く見えますが、ルールは単純です。

全体の形

diff --git a/greet.py b/greet.pyindex 3b18e51..a6f4c2d 100644--- a/greet.py+++ b/greet.py@@ -1,5 +1,6 @@ def greet(name):-    print("Hello " + name)+    message = f"Hello, {name}!"+    print(message)  def main():     greet("world")

上から順に git 拡張ヘッダーファイルヘッダー---+++)、ハンク@@ で始まるかたまり)が続きます。1つのファイルに複数のハンクがあることも、1つのパッチに複数のファイルが含まれることもあります。

ファイルヘッダー:--- と +++

ハンクヘッダー @@ -a,b +c,d @@

@@ -1,5 +1,6 @@ は、「変更前のファイルの1行目から5行、変更後のファイルの1行目から6行」を表示しているという意味です。

実際に数えてみると、上の例の文脈行(空白で始まる行)は def greet(name):、空行、def main():greet("world") の4つです。変更前の行数は文脈4行に - の1行を足して5、変更後の行数は文脈4行に + の2行を足して6なので、ヘッダーは -1,5 +1,6 になります。

本文の3種類の行

先頭の文字意味
空白両側に同じようにある文脈行
-変更前にだけある行(削除)
+変更後にだけある行(追加)

既定の文脈は変更の前後3行です(git diff -U5 のように変更できます)。文脈行は、パッチを適用するときに正しい位置を見つけるために使われます。行番号が少しずれていても、文脈が合っていれば patch は位置をずらして(offset)適用します。

1行を書き換えた場合は、- 行のすぐ後に + 行が続く組として表れます。unified 形式には「変更」を表す専用の記号がないため、連続した - のかたまりと + のかたまりを上下で突き合わせて読むのがコツです。

\ No newline at end of file

@@ -1,2 +1,2 @@ host=example.com-port=8080\ No newline at end of file+port=8080

すぐ上の行がファイルの最終行で、末尾に改行文字がないことを示す表示です。上の例では内容は同じで、変更後のファイルにだけ最後の改行が追加されました。詳しくは 改行コードと見えない差分を参照してください。

git 拡張ヘッダー

diff --git a/パス b/パス に続く行は、git 独自の追加情報です。

レビューで役立つコツ

  1. まずハンクヘッダーの行数の差を見ると、変更の規模の見当がつきます。-10,7 +10,30 なら23行増えています。
  2. 空白だけが変わったハンクを除外したいときgit diff -w を使います。インデントの整理と実際の変更が混ざったコミットを見るときに特に便利です(空白無視オプション)。
  3. 行の中で何が変わったかを見たいときは git diff --word-diff を使うか、このサイトのように行内ハイライトに対応したツールに貼り付けます。
  4. パッチを適用する前に、git apply --check ファイル.patch できれいに適用できるかを確認します。git リポジトリでない場合は patch -p1 --dry-run < ファイル.patch を使います。

このツールで試す

テキスト比較ツールの統合表示は、この形式と同じ順序で - のかたまりの後に + のかたまりを表示し、行内の変わった単語をもう一度強調します。結果バーの patch ボタンを押すと標準的な unified diff テキストがコピーされ、隣の保存ボタンで diff.patch ファイルとしてダウンロードできます。無視オプションをすべてオフにした状態で作った patch は、patch -p1git apply で元のファイルに適用できます。

テキスト比較ツールを使う