LoginSignup
0
0

ローカル環境のマージ済みブランチの一括削除コマンドを考えてみた

Posted at

対象者

git branch コマンドを打ったらとんでもない量のブランチが出る人。

前置き

開発をしているとブランチを切って作業すると思いますが、本流ブランチにマージした後もついついそのままにしちゃいますよね。
かくいう私もそんなズボラ人間。
今回の記事はそんな私を始めとしたズボラ人間ズに刺されば良いと思って書きました。

先に結論

下記の1ライナーコマンドを「ローカルブランチ多くなってきたなー」てタイミングで叩くだけ。

git stash -u && git checkout master && git fetch --prune && git branch --merged | egrep -v "\*|master|main|staging" | xargs git branch -d && git checkout -

各々のリポジトリのブランチ運用ルールによって変えたほうが良い部分もあるので、
次項の コマンドの説明 を見て各自の設定に変えてから使用してください。

ちなみに私は後述する fzf を使って更にカスタマイズしたコマンド を使ってます。
気になる方はそちらもどうぞ。

コマンドの説明

git stash -u

(もしあれば) 作業中の変更箇所を退避させます。
もし変更箇所があると次の git checkout ができませぬ。
-u オプションをつけてuntrackファイルも対象にしています。

git checkout master

今いるブランチが削除対象だった場合に削除できないので一旦チェックアウトします。
master の部分は任意の退避先ブランチ(手元の絶対消さないブランチ)を指定してください。

git fetch --prune

ついでに手元のリモート追跡ブランチも掃除しちゃおうって感じで入れてるだけ。お好みで。

こういうやつですね ↓

remotes/origin/hogehoge
remotes/origin/hugahuga

これをしないとリモートリポジトリ上で既にないブランチが残り続けてしまい邪魔なのです。

git branch --merged | egrep -v "\*|master|main|staging" | xargs git branch -d

本コマンドの肝。パイプ(|)を使ってうまくやってます。

git branch --merged | egrep -v "\*|master|main|staging"
egrep で指定した以外のマージ済みブランチ一覧を取得。

xargs git branch -d
→ さっきのブランチ一覧をパイプで受け取って順番にブランチを削除。

master|main|staging の部分は任意の 削除したくないブランチ を指定してください。

git checkout -

退避先ブランチから元のブランチへ戻します(1個前のブランチにチェックアウト)
ただ、これを入れるかはお好みです。
何故ならもともと退避先ブランチにいる場合に別のブランチにチェックアウトしてしまうので。

リポジトリごとに退避先のブランチが違う場合

これでも充分なのですが、いろんなリポジトリで並行して作業している人も多いハズ。
リポジトリ間でルールが統一されていれば良いのですがそうじゃない場合、退避先ブランチが存在しなかったりして使えなかったりします。

私がまさにそうなので下記のようにコマンドを改良しました。(めちゃ長いw

git stash -u && git checkout $(git branch | tr -d " " |fzf --height 100% --prompt "CHECKOUT BRANCH>" --preview "git log --color=always {}" | head -n 1 | sed -e "s/^\*\s*//g" | perl -pe "s/remotes\/origin\///g") && git fetch --prune && git branch --merged | egrep -v "\*|master|main|staging" | xargs git branch -d

違うところは下記の git checkout する箇所。
git checkout $(git branch | tr -d " " |fzf --height 100% --prompt "CHECKOUT BRANCH>" --preview "git log --color=always {}" | head -n 1 | sed -e "s/^\*\s*//g" | perl -pe "s/remotes\/origin\///g")

fzf を使って退避先ブランチを自分で選べるようになってます。
fzf については好きすぎて説明すると長くなるので本記事では割愛します。

最後に

いつも通り「楽したい」をモットーに作りました。
同じ問題で困っている誰かの助けになれば幸いです。

はぁーーー、xargs 好き。

0
0
0

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
0
0