git for-each-ref でマージされていない放置ブランチを棚卸しする
git for-each-ref に --no-merged と --sort=committerdate を付けると、main に入っていないブランチを最終コミット日の古い順に一覧できる。
やり方
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でも似たことができる。