テキスト差分

二つのテキストを左右または統合形式で比較。単語単位の強調、空白・大小文字の扱い、パッチのコピーに対応。

変更前
変更後
結果

比較する 2 つの版のテキストを貼り付けてください

このツールの役割

差分は一つの問いに正確に答えます: あるテキストを別のものに変えるには、何を変えなければならないか? 変更前を左に、新しい版を右に貼り付けると、このツールは削除されたすべての行、追加されたすべての行、そして — 変更された行の中では — 異なる語を正確に強調表示します。git がすべてのコミットで答えるのと同じ問いを、同じ系統のアルゴリズムで、完全にブラウザ内で計算します。

その最後の部分は、ほとんどのツールより差分ツールにとって重要です: 人が比べるものは私的である傾向があります — 本番設定の 2 つの版、最適化の前後のクエリ、昨日は動いたのに今日は失敗する応答本文です。ここではそれらが端末の外に出ることはありません。

左右並べか統合か

2 つの表示は同じ比較を違うふうに並べます。左右並べは変更前を一方に、変更後をもう一方に置き、一致する行を揃えます — 文書の改訂を読む自然なやり方です。統合はそれらを 1 つの列に交互に並べ、削除にはマイナスを、追加にはプラスを前置します — git log とコードレビューが使う形式で、よりコンパクトで、変更がまばらなときに向きます。どちらの表示も溝に変更前の行番号を印すので、ここでの発見がそのままファイルに対応づきます。

差分の計算のしかた

このツールは Myers 差分アルゴリズムを実装しています。1986 年に発表され、今日も git の既定です。最短の編集スクリプトを見つけます: あるテキストを別のものに変える、行の削除と挿入の最小の数です。その最小性こそ差分を読みやすくするものです — 変更後に同期をうまく取り直せない素朴な比較は、ブロック全体を置換として報告しますが、Myers は実際に動いた 2 行を正確に指します。

行がまず比較され、次に変更された各行の対が語のレベルで再び比較されて強調を生みます。一つの正直な限界: 2 つのテキストにほとんど共通点がないとき、最小スクリプトの探索はブラウザのタブが費やすべきより多くのメモリを要するので、編集距離 2000 を超えるとこのツールはすべてを置換として表示する方式に退き — 黙ってではなく通知とともにそうします。

空白と大文字小文字の選択肢

多くの違いは本物だが無関係です。タブからスペースにインデントし直したファイル、エディターが加えた末尾のスペース、大文字化し直したキーワード — どれも本物の変更ですが、知りたいのがロジックが変わったかどうかであれば、どれも雑音です。2 つのチェックボックスがよくある場合を扱います: 一方は各行の端の空白を脇に置き、もう一方は文字の大小を脇に置きます。それらは何を変更として数えるかだけに影響します — 表示は常に、貼り付けたとおりに各行を示します。

  • 端の空白を無視 — 各行の先頭と末尾のスペースやタブが比較の前に落とされるので、インデントだけの変更が変更行として表示されなくなります。行の内側の空白は今も数えます。
  • 大文字小文字を無視 — 大小だけが異なる行や語が等しいものとして比較されます。SQL キーワード、HTTP ヘッダー名、その他の大小を区別しない文脈に有用です。

コピーできるパッチ

コピーボタンは比較を統合差分形式で生みます — コード変更の共通語です。変更の各ブロック (ハンク) は、それが覆う行番号を示す @@ ヘッダーで始まり、削除された行はマイナスで、追加された行はプラスで始まり、いくつかの変更のない文脈行が各ハンクを囲むので、ファイルが少しずれても変更を見つけられます。

--- a
+++ b
@@ -1,3 +1,3 @@
 server:
-  port: 8080
+  port: 9090
   timeout: 30

このテキストはチケットやコードレビューに貼ったり、同僚にメールしたり、機械的に適用したりできます: ファイルに保存すれば、「git apply」や Unix の patch コマンドが変更を変更前に再生します。知っておく価値のある詳細が一つ: 改行で終わらないファイルは、そのパッチに「\ No newline at end of file」の印が付きます — このツールはその振る舞いを再現します。末尾の改行の欠落は本物の違いで、そうでないふりをすると適用できないパッチができるからです。

よくある質問

両方のテキストが同じに見えるのに変更が報告されるのはなぜですか?
違いはおそらく目に見えません: 末尾のスペース、タブとスペースの違い、最後の行の後の改行の欠落です。「端の空白を無視」をオンにすると最初の 2 つを除外できます。末尾の改行の違いは今も報告されます — git もその改行なしの印とともに報告します — バイトレベルの違いは、字が現れなくても本物だからです。
とても異なるテキストが 1 つの大きな置換として表示されるのはなぜですか?
最小の差分を見つけるには、テキストがどれだけ異なるかの二乗に比例するメモリがかかります。約 2000 の行変更という編集距離を超えると、このツールは粗いすべて置換の表示に切り替え、通知を示します。同じ文書の 2 つの版でこれに当たることは決してなく、無関係な 2 つのファイルを比べると当たります。
コピーしたパッチをどう適用しますか?
ファイルに保存し、リポジトリで「git apply thefile.patch」を実行するか、古典的な Unix ツールで「patch original.txt thefile.patch」を実行します。パッチは変更前のテキストそのものに対して生成されているので、対象がずれていない限りきれいに適用されます。
私のテキストはアップロードされますか?
いいえ。比較は完全にブラウザ内で動きます — 2 つのテキストを見られるサーバーは存在しません。それがクライアント側で行う意図です: 設定・認証情報・本番データを、マシンから出さずに比べられます。