空の差分が示している範囲
引数なしのgit diffは、作業中のファイルとステージ領域(インデックス)を比べます。git addで登録した直後は両者が同じになるため、表示が空でもコミット待ちの変更は残っています。
次の通常のgit commitに入る内容は、git diff --cachedで直前のコミット(HEAD)とステージ領域を比べて読みます。新規ファイルをまだaddしていない場合は、この2つのdiffに本文が出ないので、git statusも併用します。以下は競合のない通常のリポジトリを対象にした説明です。
表は横にスクロールできます →
| コマンド | 見る範囲 |
|---|---|
| git diff | ステージ領域から作業ファイルへの変更 |
| git diff --cached | HEADからステージ領域への変更。--stagedも同じ意味 |
| git diff HEAD | HEADから作業ファイルへの変更。未追跡ファイルの本文は含まない |
| git status --short --untracked-files=all | ステージ済み・未ステージの状態と、無視されていない未追跡ファイル名 |
1. 新しいフォルダに比較用の履歴を作る
以下はBash用です。Git 2.28以降とmktempを使います。既存の作業フォルダでは実行せず、新しいターミナルで順に進めてください。名前とメールアドレスは検証用リポジトリだけに設定する例示値です。コマンドが失敗したら、その箇所で止めます。
note.txtの内容baseを最初のコミットに保存します。ここから先も同じターミナルで実行します。
掲載コマンドは2026年9月22日にWSLのLinux環境、Git 2.53.0で実行し、以下の表示結果を確認しました。PowerShell用の構文ではありません。
trial=$(mktemp -d)
cd "$trial"
git init -b main
git config user.name 'Diff Test'
git config user.email 'diff-test@example.invalid'
printf 'base\n' > note.txt
git add -- note.txt
git commit -m 'Save base'2. addの前後で、差分の表示先が変わる
最初のdiffにはbaseを削除してstagedを追加する差分が出ます。続くaddでその内容を登録すると、2回目のdiffは空になります。一方、--cachedには同じ変更が表示されます。
末尾のstatusは「M note.txt」です。Mの後ろには、状態の右列とファイル名との区切りを合わせて2文字の空白があります。短縮表示の2列は、左がステージ領域、右が作業ファイルの状態を示します。この例は左だけがMで、変更がステージ済みです。
printf 'staged\n' > note.txt
git diff
git add -- note.txt
git diff
git diff --cached
git status --short --untracked-files=all3. addの後に編集すると、同じファイルに2つの差分が残る
作業ファイルをworkingへ書き換え、新規のscratch.txtも作ります。statusには「MM note.txt」と「?? scratch.txt」が出ます。MMは、ステージ済みの変更と、その後の未ステージ変更が両方ある状態です。
git diffはstagedからworking、--cachedはbaseからstagedへの変更を表示します。git diff HEADではbaseからworkingへの差だけが見えるため、途中で登録したstagedの内容を確かめる用途には--cachedを使います。scratch.txtは未追跡なので、どのdiffにも本文が表示されません。
printf 'working\n' > note.txt
printf 'new file\n' > scratch.txt
git status --short --untracked-files=all
git diff
git diff --cached
git diff HEAD4. 通常のcommitが保存する内容を読む
追加のaddをせずにコミットします。git show HEAD:note.txtがstagedと表示されれば、保存されたのはステージ領域の内容です。cat note.txtはworkingのままです。コミット後もstatusには「 M note.txt」と「?? scratch.txt」が残ります。note.txtの状態は先頭が空白、右列がMで、未ステージの変更を示します。
workingの内容やscratch.txtも保存したい場合は、内容を読んだうえでそれぞれaddし、再び--cachedで確かめます。この検証では差を残すため、そこまで実行しません。commit -aやファイル名指定のcommitは取り込み方が変わるので、この例と混ぜないでください。
git commit -m 'Save staged version'
git show HEAD:note.txt
cat note.txt
git status --short --untracked-files=all実際の作業で確認する順番
リポジトリのルートでstatusを読み、未追跡ファイルの名前を確認します。次にdiffでまだ登録していない変更、--cachedで次のコミットに入る変更を読みます。addの後に編集したら、もう一度両方を見てください。ファイル名の一覧だけでは本文の確認にはなりません。
statusの通常表示からは.gitignoreなどで無視されたファイルも省かれます。ここで使った--untracked-files=allは、無視されたファイルまで表示する指定ではありません。また、差分に何も出ないことは秘密情報がない保証でもありません。新規ファイルの内容や認証情報を含めてよいかは、addする前に確認します。
この記事は差分の読み分けを扱います。履歴を別ファイルへ保存する手順は、関連記事「Git bundleで履歴を保存し、別フォルダへ復元する手順」で説明しています。