やりたいこと
ローカルブランチが溜まっているので掃除したいときがあります。
$ git branch
foo
fuga
hoge
* main
piyo
こんな感じになっていたら、mainブランチと必要なブランチだけを残してスッキリしたい…また、場合によってはmainブランチじゃなくてmasterブランチがデフォルトになっていることもあるので、main・masterどちらにも対応したワンライナーを書きたいなと思いました。
作成したワンライナー
git branch | grep -v -E "main|master" | awk '{print $NF}' | xargs git branch -d
このワンライナーを実行すると、ローカルブランチがmain(master)ブランチとマージができていないブランチだけが残ります。もし、fooブランチをマージしていない場合は、以下のようにエラーが発生します。
$ git branch | grep -v -E "main|master" | awk '{print $NF}' | xargs git branch -d
error: the branch 'foo' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D foo'
hint: Disable this message with "git config advice.forceDeleteBranch false"
Deleted branch fuga (was 97ef981).
Deleted branch hoge (was 97ef981).
Deleted branch piyo (was 97ef981).
$ git branch
foo
* main
aliasを設定するなどとして、ピッと呼び出せるようにすると便利かなと思います。
ワンライナーの解説
git branch | grep -v -E "main|master" | awk '{print $NF}' | xargs git branch -d
を一段階ずつ分解して、コマンドが何をしているかをみていきます。
git branch
ローカルブランチを表示します。
$ git branch
fuga
hoge
* main
piyo
git branch | grep -v -E "main|master"
git branch
で出力したローカルブランチの一覧をパイプで受け取り、mainとmaster以外のブランチのみを表示します。
$ git branch
fuga
hoge
* main
$ git branch | grep -v -E "main|master"
fuga
hoge
grepコマンドについて
grep -E
では、拡張正規表現を使用して、結果の抽出ができます。
$ git branch
fuga
hoge
* main
$ git branch | grep -E "main|master"
* main
-v
オプションをつけると、条件に一致しない行を抽出できます。
$ git branch | grep -v -E "main|master"
fuga
hoge
git branch | grep -v -E "main|master" | awk '{print $NF}'
awk '{print $NF}'
で各行の最終フィールドを表示します。
$ git branch | grep -v -E "main|master"
fix-readme
fuga
hoge
$ git branch | grep -v -E "main|master" | awk '{print $NF}'
fix-readme
fuga
hoge
git branch | grep -v -E "main|master" | awk '{print $NF}' | xargs git branch -d
xargs
を使用してgit branch -d
コマンドに引数として抽出済みのブランチを渡します。