Diff ビューア

2 つのテキストを並べて比較。行・単語・文字単位の差分を見やすくハイライト。

Loading…

すべての処理はブラウザ内で実行されます — ファイルや入力はサーバへ送信されません。

使い方

左に元のテキスト、右に変更後のテキストを貼り付けます。粒度を選んでください。コードや散文には Line、段落レベルの散文で単語単位の差し替えを見たい場合は Word、短い文字列のタイポや 1 文字だけの設定差を探す場合は Character です。表示は Split(2 つのテキストを並べ、削除と追加を別々に色付け)か Unified(`git diff` でおなじみの `+`/`-` 形式)から選びます。

バージョン管理に入っていない比較対象に使ってください。同じに見えるが隠し文字で違うログ 2 行、ステージングと本番の JSON レスポンス、同僚から送られた YAML 設定と手元のものなどです。差分ライブラリ(`jsdiff`)は Myers のアルゴリズムをブラウザ内で実行します。アップロードしないため、PII やステージングのシークレットを含むログもマシン外に出ません。Git リポジトリ内のファイル比較はターミナルの `git diff` の方が速いです。本ツールは単発のテキスト対テキスト比較の隙間を埋めます。

小さな設定変更の Line diff

入力
Original:
port: 8080
host: localhost
retries: 3

Changed:
port: 8080
host: localhost
retries: 5
timeout: 30
出力
  port: 8080
  host: localhost
- retries: 3
+ retries: 5
+ timeout: 30

Line 粒度が既定で、ほとんどのコードレビューはこの単位で行われます。共通行は黙ったまま、変更行は旧 / 新を並べて表示し、新規行は純粋な追加として現れます。YAML や JSON ではたいていこれで十分です。

散文のタイポを Word diff で検出

入力
Original: The quick brown fox jumps over the lazy dog.
Changed:  The quick brown fox jumped over the lazy dog.
出力
The quick brown fox [jumps → jumped] over the lazy dog.

Line 粒度では文全体が「変更された」とマークされてしまいますが、Word 粒度なら `jumps` → `jumped` のみがハイライトされ、その他の単語はそのまま残ります。原稿の校正、翻訳の比較、リリース間のエラーメッセージの微調整を追うときに便利です。

不可視文字の違いを Character diff で発見

入力
Original: api.example.com
Changed:  api.exаmple.com
出力
api.ex[a → а]mple.com  (Cyrillic а, U+0430)

2 番目の `a` はラテンの a(U+0061)ではなくキリル文字の а(U+0430)で、典型的なホモグラフ攻撃のパターンです。Line や Word の diff では「文字列が違う」と言うだけで、どこが違うかは見えません。Character 粒度は問題のコードポイント 1 つだけを切り出すので、実際に何が違うのかを確認できます。

よくある質問

`git diff` との違いは何ですか?

内部のアルゴリズムはほぼ同じ(Myers diff)ですが、`git diff` はリポジトリ内で動作し、ファイル履歴、3-way マージ、リネーム検出を扱え、別の場所に当てられるパッチファイルを出力します。本ツールは貼り付けられた任意の 2 つのテキストブロブを取り、ブラウザ内で差分を計算して可視化するだけです。バージョン管理下のものには `git diff` を、リポジトリのない単発の比較(ログ、API レスポンス、2 通のメールなど)には本ツールを使ってください。

同じに見える行が「変更」とマークされるのはなぜですか?

ほぼ間違いなく不可視文字です。行末の空白、通常スペースの代わりに使われた改行禁止スペース(U+00A0)、CRLF と LF の改行差、チャットから貼り付けた幅ゼロの結合子(U+200D)などが典型です。Character 粒度に切り替えると、どのバイトが違うかが正確に見えます。散文では両方をペーストして Character モードで確認するのが確実です。

空白の違いを無視できますか?

本ツールには組み込みのトグルはありません。行末空白を無視したい場合は、入力を先に正規化してください。それぞれを別ペインに貼り、行ごとに `String.prototype.trim()` を適用するか、`sed 's/[ \t]*$//'` で削ぎ落としてください。Python や YAML のように空白に意味のあるフォーマットでは、空白の違いも見えた方がよいことが多いです。散文の比較なら、Word 粒度が空白ノイズを自然と覆い隠してくれます。

非常に長いテキストでも処理できますか?

Myers の差分計算量は O(N × D) で、N はテキストの総長、D は編集スクリプトのサイズです。テキストが似ているうちは高速で、大きく異なる最悪ケースでは二次的になります。99% の内容が共通する 10000 行ファイル 2 つの差分は瞬時に終わりますが、まったく無関係な 10000 行ファイル 2 つを貼り付けるとブラウザが数秒固まることがあります。非常に大きい、または非常に異なる入力にはストリーミング型の CLI(`diff -u`・`delta` など)を選んでください。

キーの順序を無視して JSON を比較できますか?

できません。本ツールは生テキストの差分なので、同じキーでも順序が違う JSON は別物として表示されます。両方の入力を JSON Formatter で同じソート規則で整形するか、CLI で `jq --sort-keys` を通してから貼り付けてください。構造的な差分ツール(`jd`・`dyff`・`deep-object-diff` など)はバイト単位ではなく型を理解する別レイヤーに位置します。

Split と Unified、どちらを使うべきですか?

変更が局所的なときは Split のほうがスキャンしやすいです。視線が左右に動き、変更されていないコンテキストがアンカーとして残ります。Unified は密度が高く、多くの開発者が読み慣れた `git diff` 形式に揃っているため、結果をチャットやドキュメントにコピーする場合に向きます。1 画面を超える変更では Split は視線を見失いやすく、Unified が勝ちます。

関連する概念

テキストの差分とは、ある文字列を別の文字列に変えるための最短編集スクリプトを見つける問題です。主流アルゴリズムの **Myers diff** は 1986 年に発表され、`git diff`・`jsdiff`・現代のほとんどの差分ツールが採用しています。問題をグラフ探索として定式化し、計算量は O(N × D) — テキストが似ているうちは高速ですが、悪条件では二次的になります。**Patience diff**(Bazaar と `git diff --patience` で使用)は、ユニークな行を先にソートして、大きく編集されたファイルでも読みやすい出力を生成します。**Histogram diff**(Git 2.0 以降の既定)は同一行の連続を扱うために Patience を改良した方式で、現代の開発者が日常的に見ている形式です。

粒度は何を 1 単位と数えるかを決めます。**行単位** はそれぞれの行を不可分とみなします。行境界が構造と一致するコードや設定でうまく機能します。**単語単位** は空白で分割するため、1 単語の入れ替えで文全体を赤線にしたくない散文に最適です。**文字単位** はバイトごとに比較し、行・単語の粒度では見えない不可視文字の問題(CRLF と LF、改行禁止スペース、ホモグラフ攻撃など)を表に出します。

隣接する 3 つの概念があります。**構造差分**(`jd`・`dyff`・`deep-object-diff` など)は入力を JSON / YAML としてパースしてツリーを比較するため、キーの順序入れ替えは変更として登録されません — 根本的に別の操作です。**パッチファイル**(`diff -u` の `+`/`-` テキスト出力)は事実上の交換形式で、`patch` のようなツールがこれを適用して変更後テキストを再現します。**3-way マージ**(`diff3`、Git のブランチマージで使用)は 2 つのバージョンを共通の祖先と照合してコンフリクトを検出します。これは入力 2 つのビューアの範囲外です。本ツールはその中で最も単純な位置にあります。テキストブロブを 2 つ受け取り、何が変わったかを示すだけです。

関連ツール