LoginSignup
97
82

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-05-30

問題

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 fetch する際に prune オプションを付けると削除済みのブランチを削除してくれます。

$ git fetch --prune
$ git fetch -p

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

$ git config --global fetch.prune true

本題

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

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

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

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

~/.zshrc
PROTECT_BRANCHES='main|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

ScreenShot 2020-05-31 0.33.26.png

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

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

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

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

Git関連の記事まとめ

97
82
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
97
82