ファイルを変更したのに、git diff を実行しても何も出ない。そんなときは「変更が消えた」と決める前に、ステージ済みかどうかを確認します。
git diff は、手元のすべての変更を一度に表示するコマンドではありません。何と何を比べるかで、出力が変わります。この記事では、ステージ前後の違いと、未追跡ファイルの確認方法をサンプルで確かめます。
検証日は2026年10月4日、環境はmacOS、Git 2.50.1(Apple Git-155)です。既存の作業に影響しない独立したサンプルリポジトリで、編集時にコマンドの出力を確認しました。
まずは3つのコマンドで確認する
git status --short --untracked-files=all
git diff
git diff --cached
| コマンド | 確認するもの |
|---|---|
git status --short --untracked-files=all | ステージ済み・未ステージ・未追跡などの状態 |
git diff | 作業ツリーとステージ領域の差分 |
git diff --cached | ステージ領域とHEADの差分 |
git diff HEAD | 追跡ファイルの現在の内容とHEADの差分 |
HEAD は現在チェックアウトしているコミットを指し、通常は現在のブランチの先端です。この記事は、少なくとも一つコミットがあるリポジトリを前提にします。git diff --staged は git diff --cached と同じ意味で使えます。
状態ごとの出力を先にまとめると、次のようになります。
| 状態 | status --short | diff | diff --cached |
|---|---|---|---|
| 追跡ファイルを編集 | M | 表示あり | なし |
| 編集内容をすべてステージ | M | なし | 表示あり |
| ステージ後に追加編集 | MM | 追加編集分 | ステージした分 |
| 未追跡ファイル | ?? | なし | なし |
「次のコミットに何が入るか」を見たいなら、まず git diff --cached を読みます。ここでは通常の git commit を前提にしています。git commit -a やファイル指定は、ステージ領域だけを見る操作とは扱いが変わります。
git addのあとに何も出ないのは正常なことがある
説明用のサンプルとして、すでに追跡されている sample.txt の内容を before から after に変えました。最初は git diff に変更が出ます。
-before
+after
そのファイルをステージします。
git add -- sample.txt
git diff
git diff --cached
編集時の検証では、git diff の出力が空になり、git diff --cached に同じ変更が出ました。作業ツリーとステージ領域が同じになったため、前者には差分がありません。
この状態は、まだコミット済みという意味ではありません。git status --short では次のように表示されます。
M sample.txt
2列ある状態記号のうち、左側がステージ領域の状態、右側が作業ツリーの状態です。この例の M は左側にあります。
git addのあとに編集すると両方に差分が出る
ステージしたあとで、同じファイルをさらに編集して after-again にしました。
MM sample.txt
今度は両方の列に M が出ます。
git diff --cachedはbeforeからafterへの変更git diffはafterからafter-againへの変更git diff HEADはbeforeからafter-againへの変更
git add は実行した時点の内容をステージします。その後の編集が自動で加わるわけではありません。通常の git commit なら、この例で記録されるのは after までです。
追加の編集も同じコミットへ入れるなら、内容を確認してからもう一度ステージします。別の目的なら、未ステージのまま残す方法もあります。
新規ファイルはgit diffだけでは見つからない
まだGitで追跡されていない new.txt を作ったサンプルでは、git status --short に次の表示が出ました。
?? new.txt
通常の git diff には、そのファイルの内容は出ません。git diff HEAD も未追跡ファイルの一覧を代わりに出してくれるものではありません。
コミットに必要なファイルなら、ファイルの内容を確認してから個別にステージします。
git add -- new.txt
git diff --cached -- new.txt
確認前に一括で追加すると、作業メモや不要な生成物まで入りかねません。無視対象のファイルは git status の通常の表示にも出ないため、それも含めて全ファイルを確認できたとは考えないでください。
部分ステージしたときも2つのdiffを見る
追跡済みファイルに別々の修正がある場合は、git add -p で必要な差分だけを選べます。
git add -p -- sample.txt
git diff --cached -- sample.txt
git diff -- sample.txt
選択画面では、一般に y が表示中の差分を追加、n が見送り、s が分割です。変更が近すぎると分割できない場合もあります。分けられないときは無理に操作せず、ファイルの編集を整理してから選び直します。
部分ステージのあとにテストが通っても、通常は作業ツリーをテストしています。未ステージの変更がないと動かないコミットになっていないか、別に確認が必要です。
出力が空でも、まだ確認することがある
3つのコマンドでも想定した変更が見つからない場合は、保存先のファイル、作業しているリポジトリやブランチ、指定したパスを確認します。バイナリやサブモジュールなどは、通常のテキストファイルと表示が異なります。
AIにGit操作を任せるときも、「差分を見て」だけでなく、どの差分を確認してほしいかを書きます。
git status --short --untracked-files=all、git diff、git diff --cached を確認してください。
コミットへ入る変更と、手元に残る変更を分けて報告してください。
未追跡ファイルがあれば、今回の作業に必要かも確認してください。
変更を確認したあと、メッセージをどう書くかは、Gitコミットメッセージの書き方へ進めます。
参考資料
更新履歴
- 2026-10-04: 初稿作成。ステージ前後、追加編集、未追跡ファイル、部分ステージの挙動をサンプルで確認
