2 つのテキストを行単位で比較し、追加・削除を確認する
左に旧版、右に新版を貼り付けて実行すると、行単位で差分を検出し、追加を +、削除を - で示します。変更のない行はグレーで表示され、行番号はそれぞれの原文に対応します。照合には最長共通部分列(LCS)を使い、すべてブラウザ内で完結します。
行単位の差分が必要になる場面
設定ファイルや文章、契約条項を直したあとに怖いのは、書き間違いよりも、意図せず 1 段落まるごと消してしまうことです。行単位の差分を見れば、どこを触ったのかが一覧になります。
他人のファイルを引き継いだとき、翻訳で段落が抜けていないか確認するとき、書き出した 2 つの設定の違いを確かめるときも同じです。長い文書 2 つを目で追う方法では、行の抜けを見落とします。
- 2 つの設定ファイルを比べ、意図したキーだけが変わったか確認する
- 文章や契約条項の修正で、段落の削除がないか見る
- 翻訳の抜けや重複がないか確認する
- プロジェクトを引き継ぐときに、新版で何が増えたか把握する
照合の仕様と 2 つのオプション
比較は行単位で、最長共通部分列を使って「変更が最小になる」組み合わせを探します。行番号で機械的に揃える方式ではありません。ただし行単位であるため、1 行の中の 1 語だけを変えても、その行は共通部分に含まれず、削除側と追加側の両方に現れます。行全体が赤と緑で示されるのはこのためです。
「前後の空白を無視」は各行の先頭と末尾の空白を除いてから比較します。「大文字小文字を無視」は両側を小文字にしてから照合し、表示も小文字になりますが、行番号はそれぞれの原文のままです。Windows の CRLF と Unix の LF は同じ改行として扱うため、改行コードの違いで全体が差分になることはありません。
- 語単位の変更を見たい場合は、行内差分に対応したツールが必要
- インデントの変更は、空白を無視しない限り差分として扱われる
- 大文字小文字を無視すると、表示は小文字・行番号は原文
- 行数が増えるほど LCS の表とメモリ使用量が増える
代替手段と規模の限界
片側数百〜数千行ならブラウザでも快適です。それを超えると注意が必要です。LCS は「左の行数 × 右の行数」の表を作るため、両側が 2 倍になると時間もメモリもおよそ 4 倍になります。数万行ではタブが応答しなくなることがあります。
その規模ではコマンドラインに移ってください。任意の 2 ファイルは git diff --no-index、標準的なパッチ形式は diff -u、並列表示は diff -y です。語単位の強調には、行内差分に対応したエディタか git diff --word-diff を使います。
- 大きなファイルは git diff --no-index a.txt b.txt
- パッチ形式は diff -u old.txt new.txt
- 語単位は git diff --word-diff かエディタの diff 機能
- 3 方向マージは git merge / git mergetool
よくある質問
1 語だけ変えたのに、行全体が削除+追加になるのはなぜですか?
照合が行単位で、完全に一致する行だけを「変更なし」とみなすためです。1 語でも違えばその行は共通部分列に含まれず、削除側と追加側の両方に現れます。このツールは文字単位の差分を行いません。語単位で見たい場合は、行内差分に対応したエディタや git diff --word-diff を使ってください。
どのくらいの量まで処理できますか?
両側の行数の積によります。LCS は左の行数 × 右の行数の表を作るため、各 1,000 行なら百万セル程度で通常は高速です。各 10,000 行なら 1 億セルを超え、メモリを圧迫してタブが固まることがあります。両側とも数千行以内に収め、それ以上はコマンドラインツールを使ってください。
空白を無視したのに差分が残るのはなぜですか?
このオプションが影響するのは各行の先頭と末尾の空白だけです。比較前に取り除くため、純粋なインデント変更や行末スペースの違いは差分になりません。それでも差分が残る場合は、行の中身が変わっているか、行自体が追加・削除されています。書式の揺れを完全に除きたいときは、先に両方を同じフォーマッタに通してください。
関連ツール:Text Diff