ゆるい技術メモ

記事一覧 / Git

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 は空白エラーなどを調べます。指摘がないことはテストの成功や仕様への適合を意味しません。最後に、設定ファイルや出力物へ認証情報が混ざっていないかも、共有する前に確認します。

参考にした公式資料