[Git] ローカルブランチを全部削除する



Nプログラマです。

今回はgitネタです。 xargコマンドを使ったローカルブランチをmaster以外全て削除する方法です。

注意

本当に確認もなく削除しますので、実行する時はよく考えて自己責任で実行してください。
特に開発中のブランチでコミット、リモートブランチへのプッシュなどを忘れてないかをもう一度確認し、 心配な方はバックアップを取るようにしてください。

ローカルブランチを全て削除

色々方法はありますが、自分はxargsを使う方法を取りました。
ちょうどxargsコマンドを使う機会があって、ブランチ削除と組み合わせたらいいんじゃないかと思って作ってみました。

ほんとに削除する

今回のケースは、masterブランチを残しておきたいのでmasterブランチに切り替えておきます。こんな感じです。

git checkout master # masterブランチに切り替え
git branch | xargs git branch -D # 現在ローカルブランチ(master)以外を全て削除

これを実行すると、現在の選択されているブランチ以外は全て確認なしで削除されます。

ポイントは-Dオプションの指定です。これは強制削除のオプションになるので、一気に削除することができます。
-dだとマージしていない時にエラーが表示され、そのブランチが残ってしまいます。
状況に応じて使い分けてください。

実行すれば問題なくブランチの削除されますが、以下のようなエラーが表示されます。

error: branch '*' not found.
error: Cannot delete branch 'master' checked out at 'gitリポジトリのパス'

これは、現在選択中のブランチは削除できないのと、*はブランチ名に存在しないので、エラーが表示されています。

それ以外は全て削除されているので、以下のコマンドで確認してみます。

git branch

これでmaster以外のローカルブランチが削除されていれば完了です。
お疲れ様でした。

エラーが気になる

表示されても問題ないエラーですが、表示されるとやっぱり気になりますよね。

ちょっとだけ先程のコマンドを改良してみました。こんな感じです。

git branch | awk '{ if ($1 != "*") print $1; }' | xargs git branch -D 

先程のコマンドで、xargsの前にawkのコマンドを入れてみました。

awkの処理は、現在選択されているブランチ以外のブランチ名を、xargsの引数に渡すようにしています。
条件文は、$1に現在のブランチなら*、それ以外ならブランチ名が入ってきますので、*以外の時のみブランチ名を出力するようにします。

これを実行すると先程出ていたエラーが出なくなります。

間違ってmasterを削除してしまった時

自分もやらかしました。。。

リポジトリ集約の記事で、集約する時に作った一時的なブランチを削除してみたのですが、一時ブランチに切り替えたまま実行してしまったのでmasterブランチも消えてしまいました。

ほんの少しだけヒヤリとしました。

落ち着いてmasterローカルブランチを登録し直します。
以下のコマンドで、リモート追跡ブランチからローカルブランチに持ってこれます。

方法1: branch、checkoutコマンドを使って、切り替える

git branch master origin/master
git checkout master

方法2: checkoutで一度で切り替える

git checkout master

どちらも結果は同じです。これでmasterが登録し直せたので、コミットなどができるかを確認しておきましょう。

まとめ

今回は、ローカルブランチを一気に削除する方法でした。

不要なブランチを削除してスッキリしました。
対応が終わったブランチは削除するように心がけたいと思います。

それでは、このへんで。
バイナリー!