BLOGサブスレッドの日常

2025.07.01

Gitのマージ済みブランチ全部消す

ryosms

お久しぶりです ryosms です。

Gitには色んなブランチ戦略があると思いますが、基本的には実装ブランチを切ってPRを出し、レビューが終わったらマージ、という流れになると思います。
そういう開発を進めていると、気がついたらローカルでブランチがとっちらかってることってよくありますよね?もうマージされたブランチは消してしまいたいですよね?(GitHubだとPull Requestをマージしたら自動的にブランチ消してくれるオプションがあるので便利ですね?)

そんな時は、 git branch --merged をおもむろに叩くと、(カレントブランチに対して)マージ済みブランチの一覧が確認できます。
確認できたら、それらのブランチを git branch -dで消していきましょう。

数が少なければそれでもいいんですが、多くなってくるとめんどくさいですね?
めんどくさいのでワンライナーにしてみましょう。以下のようにコマンドを組み合わせると一発で消せます。
ちなみに、全部 macOS で確認しているので、他の環境では動かないかもしれません(特にWindowsでは確実に動かないかと(WSLとか除く))。

git branch --merged \
    grep -v '*' \
    xargs -n1 git branch -d

(見た目のために改行を入れていますが、実際に実行する時にはワンライナーでOKです)

軽く解説しておくと

  • 1行目: マージ済みブランチの一覧を取得
  • 2行目: カレントブランチを除外(カレントブランチには * が付くのではじく)
  • 3行目: 全部消す( -n1 で1つずつ処理しないとエラーになるので注意)

このコマンド、手癖になればどうということはないですが、指が覚えるまではそれなりにめんどくさいと思います。
なので、以前に「Gitのエイリアスに登録すればえぇやん」と思って作ったのが以下のGist

https://gist.github.com/ryosms/fc7df05810d852f2cd9c37b34e934c1d

エイリアスを書いただけの、.gitconfigからincludeして使う想定のファイルです。
作ったはいいけど、手癖になってるので自分ではあまり使ってませんでした。
が、最近、同僚から「あれ便利なんだよね」という話が出てきたので、「あ、結構使われてるんだ」と思ってもう少し改良してみることにしました。

できあがったのがこちらになります。

https://gist.github.com/ryosms/f5bf46808971c0003d411c6c3dac6090

以下のようなところを改良しています。

  1. git のサブコマンド的に使えるようにした
    • 実行可能ファイルを git-hoge という命名規則でパスの通ったところ配置するだけ
    • サブコマンドにエイリアスを設定することも可能
  2. 固定で持っていた以下の設定をパラメータや環境変数で指定可能とした
    • 基準となるブランチ名
    • 削除対象から除外するブランチ(を指定する正規表現)
  3. デバッグ用のログとかヘルプに対応した
    • ヘルプとかは git のサブコマンドを参考にして作成

設定を環境変数で変更できるので、リポジトリ(プロジェクト)ごとに基準となるブランチや除外したいブランチが変わる場合でも、 direnv とかを使えば柔軟に対応できると思います。
というわけで、ローカルのブランチは(も)キレイに保っておきましょう。
現場からは以上です。

この記事を書いた人

ryosms