やること
ローカルブランチのうち、developブランチへマージ済みのブランチを一括で削除する。
コマンド
$ git branch --merged | grep -i -v -E 'main|develop' | xargs git branch -d
.gitconfig
私は上記のコマンドを.gitconfigに記載することで、cleanupで実行できるようになっています。具体的には.gitconfigに以下のように記載しています。
[alias]
cleanup = "!git branch --merged | grep -i -v -E 'main|develop' | xargs git branch -d"
これでgit cleanupが使えるようになります。実際に使ってみると、以下のようになります。
# 現在のブランチ一覧。branchAとbranchBは既にマージ済みだとする
$ git branch
branchA
branchB
* develop
main
# cleanupの実行
$ git cleanup
Deleted branch branchA (was 0eebe36).
Deleted branch branchB (was 6549eaf).
ここまででこの記事の目的は達成しているのであとは蛇足ですが、せっかくなのでワンライナーの解説もしようと思います。
解説
gitというよりもどちらかというとunix系のコマンドの知識になります。
| (パイプ)
はじめに、|(パイプ)から説明します。
こちらは、前のコマンドの実行結果を後のコマンドに引き渡す役割を持ちます。
つまり、上記のコマンドgit branch --merged | grep -i -v -E 'main|develop'の場合、git branch --mergedの結果の中からgrepによる検索が行われることになります。
例えば、git branch --mergedの結果が
* develop
main
branchA
branchB
の場合、grep -i -v -E 'main|develop'は上記の結果に対して行われるため、
branchA
branchB
となります。
git branch --merged
git branchコマンドは、branchの一覧を表示します。--mergedオプションを付けることでカレンとブランチにマージ済みのブランチのみが表示されます。
grep -i -v -E 'main|develop'
grepコマンドは文字列検索のコマンドになります。grep hogeとすることで文字列hogeを検索することができます。
以下、使用しているオプションを見ていきます。
-i
iオプションは、大文字と小文字を区別せずに検索をします。上記の例で言えば、hogeもHOGEも検索に引っかかるということです。
-v
vオプションは、一致しない文字列を検索します。
-E
-Eは正規表現を用いた検索を可能にします。正規表現については解説すると長くなるので割愛しますが、平たく言うと「特定の文字列パターンを表す文字列」のことです。
今回の'main|develop'という正規表現は、mainという文字列もしくはdevelopという文字列のいずれかを指します。
まとめると、grep -i -v -E 'main|develop'は、mainでもdevelopでもないブランチ名を検索していることになります。
xargs git branch -d
xargsコマンドは前のコマンドの実行結果を受け取り、xargsの後に続くコマンド(この場合git branch -d)の実行パラメータとします。
つまり、grepコマンドの結果ひとつずつがgit branch -dのパラメータとして渡されることで、mainとdevelopを除くマージ済みのブランチが削除されることとなります。
終わりに
素敵なGitライフを!