差分 (diff)

2 つのテキスト間の違いを検出・表示する処理。バージョン管理やコードレビューの基盤技術。

差分 (diff) とは、2 つのテキストファイルやデータを比較し、追加・削除・変更された部分を検出・表示する処理です。1970 年代に Unix の diff コマンドとして誕生し、以来ソフトウェア開発の基盤技術として不可欠な存在となっています。現在では Git、SVN、Mercurial などのバージョン管理システムの中核を担い、コードレビューやデプロイの自動化にも広く活用されています。

diff アルゴリズムにはいくつかの種類があります。最も基本的な Myers のアルゴリズムは、最小編集距離 (追加と削除の合計が最小になる差分) を求めるもので、Git のデフォルトアルゴリズムです。patience diff は、ユニークな行を優先的にマッチングすることで、コードの構造的な変更をより読みやすく表示します。histogram diff は patience diff を改良したもので、大規模なファイルでも高速に動作します。Git 実践の書籍で diff の活用方法を学べます。

diff の出力形式にも複数の種類があります。unified diff 形式は追加行を +、削除行を - で表示し、変更箇所の前後数行のコンテキストを含めます。GitHub や GitLab のプルリクエスト画面で見る差分表示はこの形式がベースです。side-by-side diff は変更前後を左右に並べて表示する形式で、視覚的に変更を把握しやすい利点があります。

実務では、diff はコードレビューだけでなく多様な場面で活用されます。設定ファイルの変更追跡、ドキュメントの版管理、データベースのスキーマ変更の検出、さらには法律文書の改訂履歴管理にも使われています。CI/CD パイプラインでは、diff の結果をもとにテスト対象を絞り込む「影響分析」が行われることもあります。

diff と混同されやすい概念にパッチ (patch) があります。diff が「違いの検出結果」であるのに対し、パッチは「その差分を適用するための指示書」です。diff コマンドで差分を生成し、patch コマンドで適用するという Unix の伝統的なワークフローは、現在でもオープンソースプロジェクトのメーリングリストなどで使われています。テキストアルゴリズムの書籍も参考になります。

文字数カウントの観点では、diff の出力には元のテキストに加えてメタ情報 (行番号、変更マーカー、ファイルパス、ハンクヘッダーなど) が含まれるため、diff 出力の文字数は元のテキストより多くなります。また、文字単位の diff (word diff) を使えば、行単位ではなく単語や文字レベルでの変更を検出でき、文章の推敲やコピーライティングの修正履歴を追跡する際に有用です。