DESIGN / CODE / INFRA / AI

解説

削除されたファイルだけ確認したい:git diffの--diff-filterで変更の種類を絞ろう

Gitの差分を追加・変更・削除・改名で絞る練習。比較先とフィルターを分け、ステージ済みの変更、改名検出、未追跡ファイルの扱いを確認する。

削除されたファイルだけ確認したい:git diffの--diff-filterで変更の種類を絞ろう
保存リストを見る →
この記事の道しるべ 4項目

レビュー前に、削除されたファイルだけを確認したい。追加と変更の一覧を、改名と分けて見たい。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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。