guide/whitespace-options.md

空白無視オプションの違い — diff -b、-w、-B、-Z と git の対応

行末の空白の無視、空白の量の無視(-b)、すべての空白の無視(-w)、空行の無視(-B)、大文字小文字の無視の正確な違いを、GNU diff・git のオプションと例で比較します。

最終更新: 2026-09-23

2つのファイルが「内容は同じなのに」diff が大量に出る場合、その多くは空白が原因です。エディタが行末の空白を削除した、タブをスペースに置き換えた、インデント幅を変えた、といったケースです。diff ツールにはこうした違いを無視するオプションがありますが、オプションごとに無視する範囲が違うため、正確に理解して使う必要があります。

GNU diff の空白関連オプション

オプション長い名前無視するもの
-Z--ignore-trailing-space行末の空白
-E--ignore-tab-expansionタブをスペースに展開したことによる違い
-b--ignore-space-change空白のの変化、行末の空白
-w--ignore-all-spaceすべての空白
-B--ignore-blank-lines空行だけの追加・削除
-i--ignore-case大文字小文字
--strip-trailing-cr入力行末の CR 文字

git diff の対応オプション

git のドキュメントでは次のように説明されています。

-b と -w の決定的な違い

この2つはよく混同されます。ポイントは、空白が「ある/ない」を区別するかどうかです。

-b(空白の量を無視)-w(すべての空白を無視)
a ba b同じ同じ
a bab違う同じ
x = 1x=1違う同じ
if (a) +行末の空白if (a)同じ同じ
タブ1つのインデントスペース4つのインデント同じ同じ

-b は空白のかたまりを1つに縮めて見るもので、-w は空白をすべて取り除いて見るものです。そのため -wx = 1x=1、さらには int ainta まで同じとみなします。

インデントに意味がある場合の危険

Python、YAML、Makefile のようにインデントが文法の一部であるファイルでは、空白無視オプションが実際の変更を隠してしまうことがあります。

if ready:
    start()
    notify()
if ready:
    start()
notify()

2つ目では notify() が if 文の外に出て動作が変わっていますが、-w で比較すると空白がすべて取り除かれるため、違いが消えてしまいます。-b は行頭の空白が「ある」から「ない」に変わったので、違いとして検出します。ただし、インデントが4スペースから8スペースに変わってコードが1段内側のブロックに入った場合は、空白のが変わっただけなので -b でも見えません。

確実なのは、インデントが重要なファイルは空白オプションをオフにして比較することです。空白オプションは「整形しただけの変更かどうか」を確かめる用途に使い、最終確認はオプションなしで行う習慣をつけると安全です。

空行無視(-B)の範囲

-B と git の --ignore-blank-lines は、空行だけで構成された変更を隠します。空行の追加がほかの実際の変更と同じハンクに混ざっている場合、その空行はそのまま表示されることがあります。段落間の空行の数を変えた文書や、コードフォーマッタが関数間の空行を調整した場合に役立ちます。

このサイトのオプションとの対応表

このサイト近い GNU diff近い git diff
空白:そのまま比較(オプションなし)(オプションなし)
空白:行末の空白を無視-Z--ignore-space-at-eol
空白:空白の量を無視-b-b
空白:すべての空白を無視-w-w
大文字小文字を無視-i(該当なし)
空行を無視-B に近い(空行を比較から除外)--ignore-blank-lines に近い
改行コードを正規化--strip-trailing-cr +最終改行の無視--ignore-cr-at-eol に近い

このサイトの「空行を無視」は、空行を比較対象から完全に外し、薄い色で表示するだけです。また、無視オプションは行内ハイライトにも適用されるため、「空白の量を無視」をオンにすると、空白の数だけが違う部分は強調されません。

このツールで試す

テキスト比較ツールに上の表の例を入れ、空白オプションを1つずつ切り替えてみると違いがすぐにわかります。行末の CR やファイル末尾の改行といった「見えない差分」は 改行コードと見えない差分で、結果を patch として読む方法は unified diff の読み方で続けて読めます。

テキスト比較ツールを使う