テキスト差分 — 2 つのテキストを 1 行ずつ比較
2 つのテキストを比較して差分をハイライトします。追加行・削除行・変更なしの行を色分けする line 単位の diff で、処理はすべてブラウザー内で完結します。
テキストの diff は、最も長い歴史を持ちながら原理がまったく変わっていない開発ツールの出力です。diff コマンドは 1970 年代初頭に Douglas McIlroy と James Hunt が Unix 向けに書いたもので、それ以降のすべてのバージョン管理システム — RCS、CVS、Subversion、Git — は、同じアルゴリズムの上に中核の比較エンジンを築いてきました。すなわち、2 つの line の列から最長共通部分列(LCS)を求め、その部分列に含まれない line を追加または削除として報告する、というものです。Text Diff ツールは同じアルゴリズムをブラウザー内で実装し、どの開発者も見慣れた出力形式、つまり色分けされた unified diff を採用しています。
最も多い用途は、ファイルの 2 つのバージョンを比較することです。変更前後の設定ファイル、異なる 2 回の実行から取ったログの断片、より分かりやすく書き直した段落などが典型です。ほとんどのテキストには line 単位の diff が適切な既定値になります。word 単位の diff が向いているのは、折り返されていない長い line で、変更が単語や値 1 つだけであり、line 単位の diff では行全体が変更扱いになってしまう場合です。「空白を無視」は、フォーマッターがインデントだけを変えてロジックには手を付けていないコードに向いています。出力は、unified diff のテキストとしてコピーしても、色分けされたビューで目で追っても、50 年にわたってコードレビューを支えてきたのと同じ診断結果です。
使い方
元のテキストと変更後のテキストを貼り付ける
2 つのバージョンを左右のパネルにそれぞれ貼り付けてください。diff は入力に合わせてリアルタイムに更新され、各 line が比較されて追加・削除・変更なしとして色分けされます。貼り付ける順序を逆にしてしまった場合は、入れ替えボタンで左右を交換できます。
diff アルゴリズムを選ぶ
line 単位(高速で、文章や設定ファイルに向いています)と word 単位(低速ですが、minify された JSON や URL のクエリ文字列のような長い line に向いています)から選択してください。word diff では、変更された line の中で実際に変わった単語だけをハイライトします。
diff をコピー/エクスポートする
unified diff 形式でコピーすれば、git commit やコードレビュー、チケットにそのまま貼り付けられます。ビジュアル diff は色分けされ、ARIA 注釈によりスクリーンリーダーからも読み取れます。
よくある質問
unified diff とは何ですか?
unified diff 形式は `diff -u` や `git diff` が出力する標準的な形式です。各変更箇所の周囲に数行のコンテキスト行を表示し、各 line の先頭に `+`(追加)、`-`(削除)、スペース(変更なし)を付け、ファイル名と line のオフセットを示すヘッダー行を添えます。
空白の変更は無視されますか?
はい。「空白を無視」を有効にすると、インデントや行末スペースだけが異なる line は同一として扱われます。「空行を無視」を有効にすると、両方のバージョンで空になっている line はスキップされます。どちらも、空白の変更がノイズになりがちなフォーマット済みコードの比較で役立ちます。
3 つ以上のバージョンを比較できますか?
できません。本ツールが比較できるのはちょうど 2 つのテキストです。3-way マージ比較(共通の祖先、バージョン A、バージョン B)には `git merge-file` や専用のマージツールをお使いください。2-way の diff は、変更前/変更後、原案/提案、本番/ステージングといった最も一般的なケースには十分です。
テキストはどれくらいの大きさまで扱えますか?
上限はブラウザーのメモリーに依存し、通常は入力ごとに数十 MB 程度です。10 MB を超えるファイルでは diff の計算が遅くなります。line 単位のアルゴリズムの計算量は O(N*D) で、N は総 line 数、D は差分の数です。
制限事項
- マージはできません本ツールは差分を表示するだけで、マージ結果を出力することはできません。分岐した 2 つのバージョンをマージするには `git merge` や 3-way マージツールをお使いください。diff は診断であり、merge は操作です。
- バイナリ diff には非対応扱えるのはテキストの内容だけです。バイナリファイル(画像、PDF、コンパイル済みコード)は line 単位の diff では意味のある比較ができません。バイナリの比較には `cmp`、`xxd`、または hex-diff ツールをお使いください。
- 構文を認識する diff ではありませんdiff は純粋にテキストレベルで動作します。プログラミング言語の構文を理解しないため、大きくリファクタリングされたコードでは line の対応付けを誤ることがあります。構文を認識する diff(一部の IDE が採用)はコードに対して意味的により良い結果を出しますが、処理は大幅に遅くなります。
プラットフォーム別の注意点
- macOS
- macOS のターミナルでの等価なコマンドは `diff -u file1.txt file2.txt` です。`opendiff`(Xcode の FileMerge)は、マージ機能付きでファイルやディレクトリーを比較できる GUI を提供します。
- Linux
- `diff`、`vimdiff`、`meld` が標準的なツールです。ブラウザー版は、一時ファイルを作らずにクリップボードのテキストをそのまま比較したいときに便利です。貼り付けるだけで diff がすぐ表示されます。
- Web
- すべてブラウザー内で動作します。テキストの内容がサーバーに送信されることはないため、社外に出せないソースコード、社内文書、秘密情報を含む設定ファイルの比較にも使えます。