Git マージ済みのブランチを一括削除する


問題

Gitのブランチはリモートリポジトリでマージされても自動的に削除されないので自分で削除する必要があります。

環境

$ git --version
git version 2.26.2

予備知識

マージ済みのブランチを表示

$ git branch --merged

補足: マージしてないブランチを表示

$ git branch --no-merged

補足: リモートリポジトリも含めてすべてのブランチの一覧を表示

$ git branch --all
$ git branch -a

ブランチを削除する

$ git branch -d feature/issue-xxx
$ git branch -D feature/issue-xxx

-d オプションはマージされていないブランチは削除されません。
-D オプションはマージされていないブランチも強制的に削除します。

リモートリポジトリで削除されているブランチを削除する

git featch する際に prune オプションを付けると削除済みのブランチを削除してくれます。

$ git fetch --prune
$ git fetch -p

補足: 常にpruneオプションを有効にする

$ git config --global fetch.prune true

本題

git fetch --prune でリモートリポジトリで削除済みのブランチを削除したあと git branch --merged で出てきたブランチを削除すれば良いわけです。

注意点としては、 masterdevelopment といった特定のブランチは削除対象外にしたいところです。
git alias を使っても大丈夫なのですが、 .gitconfig ファイルを管理するのが少し面倒だなと感じたのでシェルスクリプトを書きたいと思います。

zsh でも bash でも動作しますが、 zsh の例で進めます。

~/.zshrc に以下のコードを追加します。

~/.zshrc
PROTECT_BRANCHES='master|development'

git-delete-merged-branch() {
    git fetch --prune
    git branch --merged | egrep -v "\*|${PROTECT_BRANCHES}" | xargs git branch -d
}

保護したいブランチは PROTECT_BRANCHES の環境変数に | 区切りで追加してください。
シェルの設定ファイルを読み直します。

$ exec $SHELL -l

コマンドを実行します。(Gitが管理しているディレクトリ内で実行してください)

$ git-delete-merged-branch

試しに実行するとこんな感じです。

補足: .gitconfig のエイリアスでやる場合

~/.gitconfig の alias 設定でやりたい場合は下記のようにします。

[alias]
    delete-merged-branch = !git branch --merged | egrep -v '\\*|master|development' | xargs git branch -d
$ git delete-merged-branch

Git関連の記事まとめ