テキスト差分(diff)ツールが「変更箇所」をどう判定しているか

diffツールは文字通り「あなたが変更した箇所」を見つけているわけではなく、一方のテキストをもう一方に変換するための最小限の編集を計算しています。

行単位の差分が最も一般的なデフォルト

多くのdiffツールはまず行単位で比較し、行全体を追加または削除として表示する。処理が速く見やすい一方、1単語だけ直しても行全体が変更として表示されることがある。

文字・単語単位の差分はより細かく表示される

行の中でどの文字・単語が変わったかをピンポイントで示すため、より正確だが見た目が複雑になりやすく、長い行に埋もれた小さな修正を見つけるのに有効。

追加・削除の色分けはほぼ共通の慣習

多くのツールは追加を緑系、削除を赤系で表示する。これはGitなどのバージョン管理ツールに由来する慣習で、ツールが違っても直感的に読み取りやすい。

アルゴリズムは最小の変更セットを探している

diffアルゴリズムの基本は2つのテキストの最長共通部分列(LCS)を見つけ、それ以外を変更箇所とみなすというもので、目的は「人間の直感に合う差分」ではなく「編集操作数として最小の差分」を出すこと。

移動した文章は削除+追加として表示されがち

段落を別の場所に移動しただけでも、多くのdiffツールはそれを「移動」として認識せず、元の場所での削除と新しい場所での追加として別々に表示する。

コード以外でのdiffの使いどころ

バージョン管理が最も馴染み深い用途だが、契約書のドラフト間の変更追跡、スクレイピングしたWebページの内容の経時変化の検出、文書を確定させる前の2バージョンの比較など、活用範囲は広い。

小さな修正が大きな差分に見えてしまう理由

行単位のdiffは1文字でも違えば行全体を「変更」として扱うため、長い段落の中のタイプミス1つ直しただけでも見た目上は行全体の書き換えのように表示される。単語・文字単位の表示に切り替えると、実際の変更がどれだけ小さいか分かりやすくなる。

よくある質問

1単語しか変えていないのに、その行が削除と追加の両方として表示されるのはなぜですか?

それが行単位diffの表現方法だからです。行内でのインライン単語ハイライトに対応したツールでない限り、「一部だけ変更」ではなく「古い行の削除+新しい行の追加」として表示されます。

diffツールはプレーンテキスト以外も比較できますか?

コードやJSONなど構造化されたフォーマットに対応したツールも多いですが、比較のベースは基本的にテキストです。一部の専用ツールはJSONのキー順の違いを無視するなど、フォーマットの構造を理解した比較を行います。