背景
開発を進めていると、マージ済みかどうかにかかわらず役目を終えて必要なくなったブランチが大量にのこってしまうことがあると思います。
そのような場合で、特に削除対象のブランチ名に全てfeatureなど一定のキーワードを含む場合、一括でリモート・ローカル共に消すことが出来ます。
今回はそのような方法についてわかりやすく解説します。
結論
以下のコマンドを1つづつ順に実行していきましょう。
${keyword} :お好きなキーワード(e.g. feature)に置き換えてください。
git fetch --prune
git branch --remote | grep ${keyword} #対象のブランチを本当に全て消しても大丈夫かこのコマンドで確認
git branch --remote | grep ${keyword} | sed -e "s/origin\///" | xargs git push --delete origin
git fetch --prune
解説
前提
今回は以下のようなローカル・リモートブランチがあるとします。
local | remote |
---|---|
master | origin/master |
dev | origin/dev |
feature/test1 | origin/feature/test1 |
feature/test2 | origin/feature/test2 |
feature/test3 | (no branch, deleted) |
これらのブランチを、最終的に以下のように整理するのが目的です。
local | remote |
---|---|
master | origin/master |
dev | origin/dev |
-
ローカルのブランチを最新のものにアップデート
この作業をしないと、あとでリモートですでに削除されているがローカルでは残っているブランチがあった場合にリモートブランチの一括削除が失敗します。git fetch --prune
現在の状態
local remote master origin/master dev origin/dev feature/test1 origin/feature/test1 feature/test2 origin/feature/test2 -
特定のキーワードを持つリモートブランチを一括で取得
ここではこれから一括で消すブランチを表示し、本当に全て消して良いかを確認します。
大丈夫であれば先にすすんでください。
grep: 特定の文字列を含む行を抽出するコマンド。今回はfeatureブランチを抽出。git branch --remote | grep feature
outputorigin/feature/test1 origin/feature/test2
-
リモートブランチを一括で除去
sed: 特定の文字列を置換するコマンド。今回は文字列"origin/"を各行から取り除いている。
xargs: 入力を引数として別のコマンドを実行する。今回は抽出した各featureブランチに対してそれぞれgit push --delete origin {branch name}
を実行している。
git push --delete origin {branch name}: リモートブランチを削除するコマンドgit branch --remote | grep feature | sed -e "s/origin\///" | xargs git push --delete origin
現在の状態
local remote master origin/master dev origin/dev feature/test1 (no branch, deleted) feature/test2 (no branch, deleted) -
リモートで除去されたブランチをローカルで一括除去
手順1と全く同じです。git fetch --prune
現在の状態
local remote master origin/master dev origin/dev
まとめ
以上の方法で、ローカル・リモートブランチをきれいに整理することができました。
みなさんもブランチ削除を慎重に、そして大胆に行っていきましょう!