解説
削除されたファイルだけ確認したい:git diffの--diff-filterで変更の種類を絞ろう
Gitの差分を追加・変更・削除・改名で絞る練習。比較先とフィルターを分け、ステージ済みの変更、改名検出、未追跡ファイルの扱いを確認する。

レビュー前に、削除されたファイルだけを確認したい。追加と変更の一覧を、改名と分けて見たい。git diffの--diff-filterは、比較した結果を変更の種類で絞る指定だよ。
先に、作業中・ステージ済み・コミット間のどれを比較するかを決める。そのうえで、見たい種類を選ぼう。フィルターを付けても、比較先そのものが変わるわけではないんだ。
ステージ済みの四種類を用意する
GitとBashが使える端末で、次を一つのまとまりとして実行する。新しい一時フォルダーだけへ履歴を作り、既存のリポジトリやグローバル設定を書き換えないよ。rmは、この練習で作ったremoved.txtだけを削除する。
(
practice_dir=$(mktemp -d "${TMPDIR:-/tmp}/git-filter.XXXXXX") || exit 1
cd "$practice_dir" || exit 1
git -c init.defaultBranch=main init -q || exit 1
printf 'old value\n' > changed.txt
printf 'remove me\n' > removed.txt
printf 'same content\n' > old-name.txt
git add . &&
git -c user.name=Practice -c user.email=practice@example.invalid \
-c commit.gpgsign=false -c core.hooksPath=/dev/null \
commit -qm initial || exit 1
printf 'new value\n' > changed.txt
rm removed.txt
git mv old-name.txt new-name.txt || exit 1
printf 'new file\n' > added.txt
git add -A || exit 1
git --no-pager diff --cached -M --name-status
)
-cの名前とメールは今回のコマンドだけに渡す架空の値。括弧の中で移動するので、終わると元の作業場所へ戻る。一時フォルダーは内容を見直せるよう残るよ。
最後の一覧では、Aのadded.txt、Mのchanged.txt、Dのremoved.txt、R100のold-name.txtからnew-name.txtへの改名が見つかる。R100の数字は、この例で内容が同じと判定された類似度を表している。
大文字で含める種類を選ぶ
次のコマンドは、上の括弧内の最後の表示コマンドと置き換えて試そう。作業場所が元へ戻った後に、そのまま普段のリポジトリで実行する必要はないよ。
git --no-pager diff --cached -M --name-status --diff-filter=AM
git --no-pager diff --cached -M --name-status --diff-filter=D
git --no-pager diff --cached -M --name-status --diff-filter=R
| 指定 | この練習で表示するもの |
|---|---|
| AM | added.txtとchanged.txt |
| D | removed.txt |
| R | old-name.txtからnew-name.txtへの改名 |
AMは「追加と変更を同時に満たすファイル」ではなく、追加または変更のどちらか。--name-statusは名前と状態を表示する指定で、--diff-filterはそのうちどの状態を選ぶかを決める指定なんだ。
小文字は除外になる
git --no-pager diff --cached -M --name-status --diff-filter=am
小文字のamは、追加と変更を除く。この例では改名と削除が残るよ。大文字・小文字で意味が変わるため、他人のコマンドを写すときも確認しよう。
Rで絞る場合は、改名の検出も関係する。例の-Mは改名検出を有効にする指定。似ている内容かどうかの判定によって、実際の作業では改名ではなく追加と削除に見える場合がある。ファイル名を変えた操作が、どんな条件でもRと記録されるわけではないよ。
何も出ないときは比較先を見る
--cachedを外すと、通常は作業ツリーとステージの違いを見る。この例はすべてステージへ入れているので、同じフィルターでも表示が空になる。変更がなくなったのではなく、比較している二つの状態が違うんだ。
また、まだgit addしていない新規ファイルは、通常のgit diffの一覧には出ない。--diff-filter=Aを付ければ未追跡ファイルも全部見つかる、とは考えないようにしよう。未追跡も含む現在の状態はgit status --shortで確認する。
フィルターは一覧を絞るだけで、ファイルを削除したりステージを取り消したりしない。自動処理へ渡す一覧が必要な場合は、改名時に名前が二つ並ぶことや、空白・改行を含むファイル名の扱いも別に設計しよう。今回の見やすい名前の例を、そのまま汎用のファイル処理にしないでね。
編集部では2026年11月1日にGit公式資料を確認し、Git 2.52.0の一時リポジトリでA・M・D・Rの抽出、小文字の除外、未追跡が混ざらないことを検証した。比較の基本は作業中とステージ済みのdiff、記録したコミットの一覧はgit showの名前と状態へ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。