diffとは
diff(difference)とは、2つのファイルやテキストを比較して、追加・削除・変更された行を検出する処理のことです。Linuxのdiffコマンドに由来し、バージョン管理・コードレビュー・設定ファイルの変更確認など、エンジニアの日常業務で広く使われています。
unified diff形式の読み方
Gitなどで最もよく使われるunified diff形式では、変更をまとめて表示します。
--- a/file.txt
+++ b/file.txt
@@ -1,4 +1,4 @@
行目は変わらない
-削除された行
+追加された行
変わらない行
---:変更前のファイル+++:変更後のファイル@@:変更箇所の行番号-から始まる行:削除された行(赤色で表示されることが多い)+から始まる行:追加された行(緑色で表示されることが多い)- 空白で始まる行:変更なしのコンテキスト行
LCS(最長共通部分列)アルゴリズム
差分検出の内部では、LCS(Longest Common Subsequence)アルゴリズムが使われています。2つのテキストに共通して存在する最も長い行の並びを見つけ、その差分として追加・削除を特定します。
このアルゴリズムはDynamic Programming(動的計画法)で実装され、行数をmとnとするとO(mn)の計算量が必要です。大規模なファイル比較では、差分ツールが独自の最適化アルゴリズムを採用することもあります。
Gitでのdiffコマンド
git diff:ワーキングツリーとインデックス(ステージング)の差分git diff HEAD:ワーキングツリーと最新コミットの差分git diff main feature:2つのブランチ間の差分git diff --stat:変更されたファイル名と行数のサマリーgit show:直前のコミットの差分を表示
コードレビューでのdiffの活用
Pull Request(PR)のコードレビューでは、diffを正確に読む能力が求められます。効率的なレビューのポイントをいくつか紹介します。
- 追加行(+)だけでなく、削除行(-)も必ず確認する(重要なロジックが消えていないか)
- コンテキスト行(周囲の変更されていない行)で変更の意図を把握する
- 差分が大きい場合はファイル単位で分割してレビューする
- 設定ファイルの差分は特に慎重に確認する(本番環境への影響が大きい)