git diff は何と何を比べているのか
作業ツリー、ステージ、HEAD の三つを整理して、確認する差分を選ぶ。
三つの置き場所を整理する
作業ツリーは編集中のファイル、ステージは次のコミットに入れる内容、HEAD は通常現在のコミットを指します。「変更が見えない」ときは、どの二つを比較しているのかを最初に確認します。ここでは作業内容を書き換えない表示用コマンドを扱います。
まず状態と二種類の差分を見る
git status --short
git diff --no-ext-diff
git diff --no-ext-diff --cached引数のない git diff は作業ツリーとステージを比べます。--cached はステージと HEAD を比べます。変更をステージした後、前者が空でも、変更が消えたとは限りません。未追跡ファイルは通常この二つの差分には出ないため、git status も一緒に見ます。
ファイルと表示量を絞る
git diff --no-ext-diff --stat
git diff --no-ext-diff -- README.md
git diff --no-ext-diff --cached -- README.md-- の後ろはファイルパスです。名前の一覧や統計を入口にして、本文の差分まで読むと確認漏れを減らせます。--stat の行数だけでは、変更の重要性や正しさは判断できません。
日本語の小さな変更と空白を確認する
git diff --no-ext-diff --word-diff --word-diff-regex=. -- README.md
git diff --check
git diff --cached --check単語単位の差分は、空白の少ない日本語では見づらいことがあります。正規表現を . にすると文字単位の変更が分かりやすくなる場合があります。表示方法の違いなので、ファイルの内容は変わりません。
--check は空白エラーなどを調べます。指摘がないことはテストの成功や仕様への適合を意味しません。最後に、設定ファイルや出力物へ認証情報が混ざっていないかも、共有する前に確認します。