よくある質問
`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 つ受け取り、何が変わったかを示すだけです。