Git

リモートで削除されたブランチをローカルから一括で削除する

git branch コマンドでブランチ一覧を見ると、ブランチが多すぎて目的のブランチを探すのに時間がかかることはありませんか?
普段からこまめに削除していればいいのですが、忙しいとブランチが残ってしまいがちです。
そこで、マージ済みのブランチを自動で一括削除する方法をご紹介します。

一括削除コマンド

対象のリポジトリ内で、メインブランチに切り替えて下記コマンドを実行します。

// 削除対象確認(削除は実行されませんがfetchは実際に走ります)
% git fetch -p && for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do echo git branch -d $branch; done

// 削除実行
% git fetch -p && for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do git branch -d $branch; done

不安な場合は確認コマンドを実行してから削除するのが良いですが、後述の通り直接削除コマンドを実行しても問題ないようになっています。

解説

  1. git fetch -p:
    • git fetch はリモートリポジトリから変更をフェッチするコマンドです。
    • -p オプションはフェッチ時にローカルで追跡しているブランチの中で、リモートで削除されたブランチを自動的に削除する(prune)オプションです。
  2. &&:
    • これはAND演算子で、前のコマンド(git fetch -p)が成功した場合にのみ次のコマンドを実行します。
  3. for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do git branch -d $branch; done:
    • for branch in $(...) ; do ... ; done:
      • これはBashのループ構文です。in の後ろの$(...) で生成されたリストの各要素に対してループを回し、それぞれに対してdo ... ; done の中のコマンドを実行します。
    • $(git branch -vv | grep ': gone]' | awk '{print $1}'):
      • git branch -vv:
        • forループのinの対象部分です。
        • ローカルブランチのリストを表示し、それぞれのブランチが追跡しているリモートブランチとその状態を表示します。
      • |(パイプ):
        • 前のコマンドの出力を次のコマンドの入力として渡します。
      • grep ': gone]':
        • git branch -vv の出力から、リモートで削除されたブランチ(goneと表示されるブランチ)をフィルタリングします。
      • awk '{print $1}':
        • フィルタリングされた結果から、出力の最初のフィールド(ここではブランチ名)を抽出します。
    • git branch -d $branch:
      • doからdoneに挟まれたここがループの中で実行する処理部分です
      • フィルタリングされ抽出された各ブランチ名: $branchに対して、git branch -d コマンドを実行してローカルブランチを削除します。

この一連の処理により、リモートで削除されたブランチと紐づいているローカルブランチを自動的に削除することができます。
なお、branch -dと小文字にしているので、未マージのままリモートから削除された場合は以下のようなエラーメッセージが表示され、削除されません。


error: The branch 'fix/12345-xxx' is not fully merged.
If you are sure you want to delete it, run 'git branch -D fix/12345-xxx'.

削除したい場合は表示されている通り、git branch -D fix/12345-xxxというコマンドを実行してください。

実行結果サンプル

% git fetch -p && for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do git branch -d $branch; done
...
Deleted branch fix/123-fix-discount-analytics (was 12345abcde).
Deleted branch feature/456-add-items (was vwxyz67890).
Deleted branch fix/789-add-log-on-daily-table (was a1b2c3d4e5).

注意点: 紐づけ(追跡)に関して

リモートとの紐づけを確認するので実行が安全にはなっていますが、代わりに紐づけしていないブランチは削除されません。
例えば、git push origin fix/123-fix-discount-analytics というように、紐づけずに毎回ブランチ名を指定してpushしていたブランチはマージされていても削除されません

git push -u origin fix/123-fix-discount-analytics というように、-uオプションを指定してpushすることでリモートブランチを追跡(紐づけ)することができます。
一度紐づけられたブランチは、git pushgit pull というように、後ろの指定を省略してもpushやpullができるようになります。
間違ったブランチにpushするといった事故も防げるので、初回push時には-uオプションをつける癖をつけておきましょう。

-Git