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を正確に読む能力が求められます。効率的なレビューのポイントをいくつか紹介します。

  • 追加行(+)だけでなく、削除行(-)も必ず確認する(重要なロジックが消えていないか)
  • コンテキスト行(周囲の変更されていない行)で変更の意図を把握する
  • 差分が大きい場合はファイル単位で分割してレビューする
  • 設定ファイルの差分は特に慎重に確認する(本番環境への影響が大きい)