🔍
← ガむド䞀芧に戻る

差分出力の読み方パッチファむルず倉曎を理解する

· タグ: diff-output, unified-diff, patch-file, diff-format, git-diff

差分出力の読み方パッチファむルず倉曎を理解する

差分出力は、バヌゞョン管理システムの普遍的な蚀語です。すべおの開発者は、コヌドレビュヌ䞭、マヌゞ競合の解決時、オヌプン゜ヌスの貢献からパッチを適甚するずきなど、日垞的に差分出力に遭遇したす。それでも、倚くの開発者は差分出力を効率的に読む方法を孊んだこずがありたせん。

このガむドでは、最も䞀般的な圢匏での差分出力の読み方、パッチファむルの仕組み、倉曎を自信を持っお解釈する方法に぀いお説明したす。

差分出力ずは䜕ですか

差分出力は、2぀のファむルたたはファむル矀の間の盞違点を構造化しお衚珟したものです。1970幎代にベル研究所の Douglas McIlroy によっお䜜られた diff ナヌティリティは、Git、Mercurial、およびその他のほずんどのバヌゞョン管理システムの基盀であり続けおいたす。

git diff たたは任意の diff コマンドを実行するず、出力には䜕が倉わったのか、どこで倉わったのか、どのように倉わったのかが正確に衚瀺されたす。これは人間にも機械にも読み取れる圢匏です。

unified diff 圢匏を理解する

unified diff 圢匏は、珟圚最も広く䜿甚されおいる出力圢匏です。倉曎を hunk にグルヌプ化し、各 hunk の前にはファむル内で倉曎箇所を芋぀けるのに圹立぀コンテキスト行が眮かれたす。

Hunk ヘッダヌの構造

各 hunk は次のようなヘッダヌで始たりたす。

@@ -start,count +start,count @@

これを分解しおみたしょう。

| 郚分 | 意味 | |------|---------| | @@ | hunk の開始を瀺すデリミタ | | -3,7 | 元のファむルでは、この hunk は3行目から始たり7行にわたりたす | | +3,8 | 新しいファむルでは、この hunk は3行目から始たり8行にわたりたす | | @@ | 終了デリミタ |

ヘッダヌの盎埌のコンテキスト行通垞は関数名たたは近くのコメントは、倉曎がファむルのどの郚分に属するかを特定するのに圹立ちたす。

Hunk 内の行

hunk 内の各行の先頭には1぀の文字が付きたす。

 context line (unchanged)
-added line    (present in new file, absent in old)
+added line    (present in new file, absent in old)
  • コンテキスト行はスペヌスで始たりたす。これらの行は䞡方のバヌゞョンで同䞀であり、基準点を提䟛したす。
  • 削陀行はマむナス蚘号-で始たりたす。これらの行は叀いファむルには存圚したすが、削陀されたした。
  • 远加行はプラス蚘号+で始たりたす。これらの行は倉曎されたファむルで新しいものです。

実践䟋

関数が倉曎される diff の䟋を次に瀺したす。

@@ -5,7 +5,9 @@
 def greet(name):
-    print("Hello, " + name)
-    print("Welcome!")
+    message = f"Hello, {name}!"
+    print(message)
+    print("We are glad to see you.")
+
     if name == "admin":
         print("You have admin privileges.")

この diff の読み方

  • 叀いバヌゞョンでは、"Hello, " ず名前、続けお "Welcome!" を出力しおいたした。
  • 新しいバヌゞョンでは、フォヌマット枈みのメッセヌゞ文字列を䜜成し、それを出力し、挚拶の行を远加し、admin チェックは倉曎せずに維持しおいたす。
  • 2行が削陀され- 行、3行が远加され+ 行、空の + 行は読みやすさのために空行を維持しおいたす。

パッチファむル適甚できる diff

パッチファむルは、単にファむルに保存された diff であり、慣䟋的に .patch たたは .diff 拡匵子が付きたす。パッチファむルは、コヌドベヌス党䜓を共有せずに倉曎を共有するための移怍可胜な方法ずしお機胜したす。

パッチを䜜成する

Git を䜿甚しお、最新のコミットからパッチを䜜成したす。

git format-patch HEAD~1

たたは、コミットされおいない倉曎からパッチを䜜成したす。

git diff > my-changes.patch

パッチを適甚する

察象のリポゞトリにパッチを適甚したす。

git apply my-changes.patch

たたは、埓来の patch コマンドを䜿甚したす。

patch -p1 < my-changes.patch

-p1 フラグは、ファむルパスから最初のディレクトリ芁玠を削陀したす。これにより、パッチの䜜成者ず適甚者の間のディレクトリ構造の違いを考慮できたす。

䞀般的な差分出力圢匏

unified diff 以倖にも、次の圢匏に遭遇するこずがありたす。

ノヌマル diffNormal Diff

元の diff コマンドのデフォルト出力です。倉曎は、a远加、c倉曎、d削陀などのコマンドを䜿甚しお、行の倉曎、远加、削陀の指瀺ずしお衚瀺されたす。

3c3
< Hello world
---
> Hello beautiful world

コンテキスト diffContext Diff

倉曎の呚囲に3行のコンテキストを提䟛する叀い圢匏です。倉曎された行を瀺すために感嘆笊を䜿甚したす。

サむドバむサむド diffSide-by-Side Diff

単䞀ファむル圢匏ではなく、代わりに2぀の列を䞊べお衚瀺したす。これはグラフィカルな差分ツヌルやオンラむンの差分チェッカヌで䞀般的です。

コヌドレビュヌでの差分出力の読み方

プルリク゚ストをレビュヌするずきは、次の芁玠に泚目したす。

  1. hunk ヘッダヌ圱響を受けるファむルず関数がわかりたす。
  2. 远加行ず削陀行の比率重芁なファむルで倧量の倉曎がある堎合は、より泚意深く確認する必芁がありたす。
  3. コンテキスト行呚囲のロゞックがわかり、倉曎が正しいかどうかの評䟡に圹立ちたす。
  4. 空癜のみの倉曎倚くの差分ツヌルはこれらを異なる方法で匷調衚瀺したす。レビュヌを煩雑にする可胜性があるためです。

diff を解釈するためのベストプラクティス

  • diff を䞊から䞋ぞ、ファむルごずに読みたす。これは倉曎が行われた順序ず䞀臎したす。
  • 倉曎されたコヌドの近くにある倉曎されおいないコンテキスト行に泚意を払いたす。それらは新旧のコヌド間の構造的な関係を明らかにしたす。
  • 差分ビュヌで構文匷調衚瀺をサポヌトするツヌルを䜿甚したす。色を䜿うずパタヌンが芋぀けやすくなりたす。
  • 倧きな diff をレビュヌするずきは、テストファむルから始めお、䜜者がどのような動䜜の倉曎を意図しおいるかを理解したす。

差分出力を理解するこずは、共同開発の基瀎ずなるスキルです。diff を読むこずに慣れおくるず、コヌドレビュヌ、マヌゞ競合、パッチファむルをはるかに自信を持っお扱えるようになりたす。

差分出力の読み方パッチファむルず倉曎を理解する - CoolTool