テキスト差分比較とは
diff コマンドが起源であり、現在はGitをはじめ多くのバージョン管理システムや開発ツールの基盤技術となっています。
ファイルを手作業で見比べて変更点を探すのは、量が増えるにつれて非常に労力がかかり、見落としのリスクも高まります。差分比較ツールを使えば、変更箇所を自動的に特定して視覚的にハイライト表示できるため、レビュー効率が飛躍的に向上します。
差分比較は英語で "diff"(difference の略)と呼ばれ、動詞としても「diffを取る」「diffする」という表現がエンジニアの間で日常的に使われます。
Diff表示の読み方
追加行・削除行・変更なし行
| 記号 | 色(一般的な配色) | 意味 |
|---|---|---|
+ |
緑 | 新しいバージョンで追加された行 |
- |
赤 | 古いバージョンから削除された行 |
| (空白) | 白/グレー | 両バージョンで変更のないコンテキスト行 |
「行が変更された」場合は、削除行(-)と追加行(+)の組み合わせ で表現されます。純粋な「変更」という差分記号はなく、「古い行を削除して新しい行を追加した」と解釈します。
unified diff 形式の解説
最も広く使われる形式が unified diff(統一差分形式)です。diff -u または Git が出力する標準的な形式で、次のような構造になっています。
--- a/sample.txt 2026-04-10 10:00:00
+++ b/sample.txt 2026-04-13 12:00:00
@@ -3,7 +3,8 @@
第1行目(変更なし)
第2行目(変更なし)
-古いテキスト(削除された行)
+新しいテキスト(追加された行)
+さらに追加された行
第5行目(変更なし)
第6行目(変更なし)
---(マイナス3つ): 変更前ファイルのパスと更新日時+++(プラス3つ): 変更後ファイルのパスと更新日時@@ -3,7 +3,8 @@(ハンクヘッダー): 変更箇所の行番号情報。-3,7は「変更前ファイルの3行目から7行分」、+3,8は「変更後ファイルの3行目から8行分」を意味します- 行頭の
-が削除行、+が追加行、空白がコンテキスト行です
サイドバイサイド表示 vs インライン表示
Diffの表示方法には大きく2種類あります。
| 表示形式 | 特徴 | 向いている場面 |
|---|---|---|
| サイドバイサイド (Split View) |
変更前と変更後を左右に並べて表示。全体の変化が一目でわかる | コードレビュー、文書の大幅な書き換え確認 |
| インライン (Unified View) |
変更箇所を1列にまとめて表示。縦にスクロールして確認する | コマンドライン操作、横幅が限られる環境 |
差分アルゴリズムの基本
LCS(最長共通部分列)の概念
LCSとは、2つの文字列(または行の列)から順番を保ちながら共通して取り出せる最長の部分列です。差分アルゴリズムは LCS に含まれない要素を「削除または追加された箇所」として差分に表示します。
例えば ABCDE と ACDE の LCS は ACDE であり、差分は「B が削除された」となります。
Myers差分アルゴリズム
実際の diff コマンドや Git が採用するのが Myers アルゴリズム(1986年、Eugene W. Myersによる論文)です。このアルゴリズムは「編集回数が最小になる差分(最短編集スクリプト)を効率的に発見する」という特性を持ちます。
Myers アルゴリズムが広く使われる理由は、実用的なテキストファイルのほとんどで O(N + D²) という高速な計算量で動作するためです(N はテキストの長さ、D は差分の数)。変更が少ないほど高速に処理できます。
行単位 vs 単語単位 vs 文字単位の違い
| 比較単位 | 特徴 | 主な用途 |
|---|---|---|
| 行単位 | デフォルト。1行全体を比較の最小単位とする。速く見やすいが、1文字の違いでも行全体が変更と判定される | ソースコードのdiff、一般的なファイル比較 |
| 単語単位 | 空白で区切られた単語を最小単位とする(git diff --word-diff)。文章の中の一語変更を正確に表示できる |
自然言語テキスト、ドキュメントのレビュー |
| 文字単位 | 1文字ずつ比較。最も細かく差分を表示できる。変更が多い場合は逆に読みにくくなることも | スペルミス・句読点の修正確認、短いテキスト |
活用場面
コードレビュー(Git の Pull Request)
エンジニアが最も頻繁にdiffを使う場面です。GitHub・GitLab・Bitbucketなどのコードホスティングサービスでは、Pull Request(プルリクエスト)を作成すると自動的にブランチ間の差分が表示されます。レビュアーは追加・削除されたコードを一目で確認でき、バグの混入防止・品質担保 に直結します。
契約書・法律文書の修正チェック
契約書の改訂版を受け取った際、どの条項が変更されたかを差分比較で確認できます。法律文書は一語一句の変更が法的効力に影響するため、見落とし防止 の観点から差分比較ツールの活用は非常に有効です。Wordの変更履歴機能が使えないプレーンテキスト形式でも対応できます。
ドキュメントのバージョン管理
技術仕様書・マニュアル・議事録などのドキュメントを改訂する場合、差分比較によってどの記述が更新されたかを明確に記録できます。GitにMarkdownやテキストファイルを管理することで、いつ・誰が・何を変えたかを完全に追跡できます。
設定ファイルの変更確認
サーバーやアプリケーションの設定ファイル(nginx.conf、.env、docker-compose.yml など)の変更前後を比較することで、意図しない設定変更の検出 やトラブルシューティングが容易になります。本番環境への変更適用前のチェックにも有効です。
翻訳テキストの比較
原文が更新された際に、翻訳済みテキストとの差分を取ることで追加・変更が必要な箇所を素早く特定できます。全文を再翻訳せずに変更分だけを効率的に翻訳作業に回せます。
SEO: meta description 変更前後の確認
ウェブサイトの meta description や本文コピーを A/B テスト的に改善する際、差分比較でどの文言を変えたかを正確に記録しておくと施策の効果測定と振り返りに役立ちます。文字数カウントと組み合わせると、上限文字数に収まっているかの確認も同時に行えます。
テキスト差分比較ツールの使い方
3ステップで差分を確認できます。
- 比較元テキストを入力 — 左側(Before)の入力欄に、変更前のテキストを貼り付けます。ファイルの中身をそのまま貼り付けてください。
- 比較先テキストを入力 — 右側(After)の入力欄に、変更後のテキストを貼り付けます。
- 差分を確認・コピー — 追加行(緑)・削除行(赤)が自動ハイライトされます。差分のみを抽出してコピーすることもできます。
- A ⇄ B 入替で視点を切替える — 「A ⇄ B 入れ替え」ボタンで前後の方向を入れ替えると、差分の見え方が逆転します。視点を変えて確認すると見落としを減らせます。
- 業務シーンに適用する — 契約書改訂・コードレビュー・設定ファイル更新・翻訳校正など、業務で日常的に発生する「変更前と変更後の差分確認」に適用します。
開発での高度な使い方
git diff コマンドの基本
Gitリポジトリ内でファイルの差分を確認するには git diff コマンドを使います。代表的な使い方を以下に示します。
# ワーキングツリーとステージングエリアの差分を表示
git diff
# ステージングエリアと最新コミットの差分を表示
git diff --staged
# 特定のコミット間の差分を表示
git diff abc1234 def5678
# 特定ファイルの差分のみ表示
git diff HEAD -- path/to/file.txt
# ブランチ間の差分を表示
git diff main feature-branch
--word-diff オプション
行単位ではなく単語単位で差分を表示したい場合は --word-diff オプションを使います。文章の一部のみが変更された場合に特に効果的です。
# 単語単位の差分表示(色付き)
git diff --word-diff=color
# 差分箇所を括弧で囲んで表示(カラー非対応環境でも見やすい)
git diff --word-diff=plain
出力例(--word-diff=plain)では、削除された単語が [-削除-]、追加された単語が {+追加+} で示されます。
.gitattributes でのdiffドライバー
バイナリに近いファイル(.docx・PDF・画像など)や特殊なフォーマットのファイルに対して、カスタムの差分処理を設定できます。
# .gitattributes の例
# Wordファイルをテキスト抽出してdiffを取る
*.docx diff=word
# JPEGのexifメタデータをdiffの対象にする
*.jpg diff=exif
# git config でドライバーを登録
git config diff.word.textconv docx2txt
git config diff.exif.textconv exiftool
JavaScript での簡易diff実装
フロントエンドやNode.jsアプリケーションでdiff機能を実装する際は、diff ライブラリや jsdiff が広く使われています。
// npm install diff
import { diffLines, diffWords } from 'diff';
const oldText = `第1行
変更前のテキスト
第3行`;
const newText = `第1行
変更後のテキスト
第3行
追加された第4行`;
// 行単位の差分を取得
const lineDiff = diffLines(oldText, newText);
lineDiff.forEach(part => {
// 追加された行
if (part.added) {
console.log(`追加: ${part.value}`);
}
// 削除された行
else if (part.removed) {
console.log(`削除: ${part.value}`);
}
// 変更なし
else {
console.log(`変更なし: ${part.value}`);
}
});
// 単語単位の差分も同様に取得できる
const wordDiff = diffWords(
'素早い茶色のキツネ',
'素早い灰色のキツネが飛ぶ'
);
より高機能な差分表示UIが必要な場合は monaco-editor(VS Codeのエディタコンポーネント)の diff エディタモードが利用できます。GitHubと同等のサイドバイサイド表示をWebアプリに簡単に組み込めます。