【Git】特定のブランチ以外を一括で削除するコマンド・スクリプト

git

ローカル環境にたくさんできてしまったブランチを整理するためのTipsを紹介します。
今回の対象はローカル環境のみです。リモートリポジトリのブランチ削除については言及しません。

Gitブランチの削除方法のおさらい

ブランチを削除するgitコマンド

fooというブランチを強制的に削除するコマンドは以下の通りです。

$ git branch -D foo
or
$ git branch --delete –force foo

マージされている場合のみ削除するコマンドは以下の通りです。

$ git branch -d foo
or
$ git branch --delete foo

ブランチを一括で削除するgitコマンド

foo・barというブランチを一括で強制削除するコマンドは以下の通りです。

$ git branch -D foo bar
or
$ git branch --delete –force foo bar

特定のGitブランチ以外を削除する方法

mainブランチ以外を一括で削除するgitコマンド

mainブランチ以外を一括で強制削除するコマンドは以下の通りです。
git branch | grep -v mainでmain以外のブランチ名を取得し、xargsを利用してgit branch -Dにブランチ名を渡しています。

$ git branch | grep -v main | xargs git branch -D

複数のブランチ以外を一括で削除するgitコマンド

main・developブランチ以外を一括で強制削除するコマンドは以下の通りです。
grep -vの対象となる文字列を複数設定しています。

$ git branch | grep -v "main\|develop" | xargs git branch -D
or
$ git branch | grep -v -e main -e develop | xargs git branch -D
or
$ git branch | grep -v main | grep -v develop | xargs git branch -D

『特定のブランチ以外を強制一括削除』をスクリプト化する

『直近で利用した(している)ブランチ以外を一括で削除したい』というケースに開発中よく遭遇したためスクリプト化しました。
以下はスクリプトの紹介になります。

# コマンド名は『'g'it 'br'anch 'd'elete e'x'clude』が由来です。
gbrdx() {
  # カレントブランチ(アスタリスクからはじまるブランチ)はブランチ一覧から除外
  command="git branch | grep -v '*'"
  for branch_name in "$@"; do
    command="${command} | grep -v ${branch_name}"
  done
  command="${command} | xargs git branch -D"
  eval ${command}
}

実行結果は以下の通りです。

$ git branch
  bar
  baz
  develop
* foo
  main

$ gbrdx main develop
Deleted branch bar (was 57d7203).
Deleted branch baz (was 57d7203).

$ git branch
  develop
* foo
  main

誤操作を防ぐため、yの入力を待ってからブランチ削除するようにしたスクリプトは以下になります。

verify_execution() {
  echo "Are you sure[y/n]"
  read answer
  case $answer in
    y)
    true
    ;;
    *)
    false
    ;;
  esac
}

gbrdx() {
  command="git branch | grep -v '*'"
  for branch_name in "$@"; do
    command="${command} | grep -v ${branch_name}"
  done
  echo 'These branches will be removed.'
  eval ${command}
  verify_execution
  if [ $? -eq 0 ] ; then
    command="${command} | xargs git branch -D"
    eval ${command}
  fi
}

実行結果は以下の通りです。

$ git branch
  bar
  baz
  develop
* foo
  main

$ gbrdx main develop
These branches will be removed.
  bar
  baz
Are you sure[y/n]
y
Deleted branch bar (was 57d7203).
Deleted branch baz (was 57d7203).

$ git branch
  develop
* foo
  main

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考記事