メインコンテンツへスキップ

← ブログ一覧へ

2つのテキストを比較して、変わった箇所を正確に知る方法

同じものの2つのバージョン——編集前後の文書、2つの設定ファイル、同僚が書き直した段落——があり、「どこが変わったか」を正確に知りたい。両方を並べて読むのは遅く、見落としも出ます。**diff(差分比較)**なら一瞬です。

1 語の変更が実際どう見えるか。 テキスト比較に、同じ 2 行の 2 バージョンを与えました。違いは最後の 1 語だけ —— dog と cat です。出力では the quick brown fox は印のない共通行として残り、変わった行は 2 回表示されます。1 回は −(削除)、もう 1 回は +(追加)。diff について理解すべき肝心な点がこれです。diff は「1 語変わった」とは報告しません。単位は行なので、1 文字の編集でも「行の削除+行の追加」として現れます。だからファイルを再整形すると、実質的な変更がゼロでも diff は役に立たなくなります。

これは実際の出力で、出力の説明ではありません。 同じ 2 行の 2 バージョン(最後の 1 語だけ違う)をテキスト比較に通した結果です。

the quick brown fox
−
jumps over the lazy dog
+
jumps over the lazy cat

共通の行は無印、変わった行は 2 回現れ、片方は −、片方は + です。diff について身につけるべき点はここです。単位は行なので、1 文字の編集でも行が丸ごと削除され、丸ごと挿入されます。ファイルを再整形すると、実質的な変更がなくても diff が壊れる理由もこれです。

diff は実際に何をするのか

diff アルゴリズムは、一方のテキストをもう一方に変えるために必要な最小の追加と削除を見つけ、色で示します:追加は緑、削除は赤、変更なしは無色。これは「変更履歴」やあらゆるコードレビューの背後にある同じ技術です。

行比較 vs 単語比較

便利な粒度は2つあります:

  • 行比較は行単位で比べます。コード・設定ファイル・CSV・リストに最適で、これらの「変更」はたいてい行ごと追加・削除・置換されます。
  • 単語比較は単語ごとに比べます。文章に最適で、一文の中で「1つの単語だけ」変わったことを、行全体が赤緑になる代わりに確認できます。

まず行比較を使い、ある行が変更ありと出ても違いが分からないときは単語比較に切り替えます。

「何を単位とするか」という問いには、私たちの出力に測れる答えがあります。1 語だけ違う 2 バージョンが生んだのは 1 行ではなく 3 行でした。共通の行は無印、変わった行は 2 回 —— 片方は −、片方は +。行 diff は「1 語変わった」と言えません。行がその単位だからです。だからファイルを再整形すれば(折り返しや字下げの変更)、意味が同一でも diff は壊れます。

結果の読み方

  • 赤い行の直後に緑の行 = その行が編集された(削除され、新しい形で再追加)。
  • 緑の行だけ = 追加。
  • 赤い行だけ = 削除。
  • 要約(例:+3 −1)で変更の規模がひと目で分かります。

読み方は機械的です。無印は生き残り、− は去り、+ は来た。私たちの実行結果はまさに the quick brown fox / − / jumps over the lazy dog / + / jumps over the lazy cat でした。削除行と追加行が隣接している点に注目してください。それが「その行が変更された」(本当に削除・挿入されたのではない)という視覚的な手がかりです。

以下は、私たちのテキスト差分ツールが「1 語だけの変更」に対して実際に返した結果です。同じ 2 行のうち最後の語だけが違います:

the quick brown fox
−
jumps over the lazy dog
+
jumps over the lazy cat

返ってきたのは 1 行ではなく 3 行。共通の行は無印、変わった行は 2 回 —— 片方は − の下、片方は + の下。行 diff は「1 語変わった」と報告できません。行が比較の単位だからです。

なぜブラウザ内で比較するのか

diff は機微な内容——契約書、設定ファイル内の資格情報、未公開の原稿——を扱うことがよくあります。テキストをアップロードするオンラインツールは不要なリスクです。テキスト比較ツールは完全にブラウザ内で比較し、どちらのバージョンも端末から出ません。

第三の粒度:文字比較

とても短く密な文字列では、単語比較でも粗すぎます。文字比較は一文字ずつ比べ、「たった一文字が決め手」という場面に向きます——注文番号で入れ替わった数字、ハッシュや API キーの一文字の誤り、長い token に紛れたタイプミスなど。単語比較なら token 全体を「変更」と印を付けますが、文字比較は違う一文字をそのまま指し示します。

目安:ファイルやリストは行比較、文章は単語比較、コードや識別子は文字比較。

この単位こそ、再整形が diff を壊す理由です。同じ 3 語を 2 回入力しました。1 回は 1 行に、もう 1 回は 3 行に。内容は何も変えていません:

−
one two three
+
one
+
two
+
three

すべての行が印付きです。編集は一切していません。折り返しを変えただけです。語単位や文字単位の diff ならここでは「変更なし」と報告します。粒度の議論は、議論ではなく 1 回の計測で決着します。

diff を使う場面

  • 修正のレビュー——同僚・編集者・AI の書き直しが、草稿のどこを実際に変えたかを確認する。
  • バージョンの比較——契約書・規約・設定ファイルの変更前後の違い。
  • コピーの検証——2 つのエクスポート、2 つの翻訳、2 つのリストが一文字単位で一致するか確かめる。
  • 近い重複の追跡——見た目は同じでも結果が違う 2 つの塊。

よくある誤解

  • diff は「移動」を検出しない——段落を切って下に貼ると、多くのツールは「1 削除+1 追加」と表示し、移動とは扱いません。
  • 行全体が色づいても、全部変わったわけではない——行比較では 1 単語の変更でも行全体に印が付きます。単語比較や文字比較に切り替えると、本当の変更が見えます。
  • 見えない文字も数に入る——同じに見える 2 行も、行末の空白・タブ・改行コードだけ違うことがあります。それは不具合ではなく本物の差分で、改行・重複行の削除ガイドの整えの手順が防ぐのもこれです。

印はもう 1 つの区別も見せます。挿入が返すのは

alpha
+
beta
 
gamma

削除が返すのは

alpha
−
beta
 
gamma

本当の挿入・削除では印付きの行がちょうど 1 つ。変更では −/+ が隣り合って現れます。この隣接が最初に覚える手がかりであり、移動したコードがレビューであれほど騒がしく見える理由でもあります。移動は遠く離れた削除と挿入で、両者を対にする手がかりがないからです。

コツ:先に整えると diff がきれいに

2つのファイルが行末の空白・タブ・改行コードだけ違う場合、diff は雑然とします。まず両方をテキストクリーナーにかけ——行を trim し空白を統一——すれば、本当の差分が際立ちます。