テック技報最新号へ →
コード

git for-each-ref でマージされていない放置ブランチを棚卸しする

git for-each-ref に --no-merged と --sort=committerdate を付けると、main に入っていないブランチを最終コミット日の古い順に一覧できる。

@noritada · 投稿 2026-11-01
#git

やり方

bash
git for-each-ref refs/heads \
  --no-merged=main \
  --sort=committerdate \
  --format='%(committerdate:short) %(refname:short) %(authorname) %(subject)'
  • refs/heads はローカルブランチ。リモートを見るなら refs/remotes/origin(先に git fetch --prune)。
  • --no-merged=main は main に取り込まれていないブランチだけ。逆に --merged=main なら消しても安全な候補になる。
  • --sort=-committerdate(マイナス付き)にすると新しい順。

マージ済みのローカルブランチを消すなら、一覧を目で確認してから。

bash
git for-each-ref refs/heads --merged=main --format='%(refname:short)' \
  | grep -v '^main$' | xargs -r git branch -d

注意点

  • Squash merge や rebase merge で取り込んだブランチは、元のコミットが main に無いので --no-merged 側に出る。消すかどうかは PR の状態で判断する。
  • %(upstream:track) を書式に足すと、[gone](リモートで削除済み)のブランチが分かる。
  • --merged / --no-merged は Git 2.7 以降の for-each-ref で使える。git branch --no-merged main --sort=committerdate でも似たことができる。

出典

X の元の投稿を開く