はじめに
年の瀬といえば掃除ですね🧹
皆さん、Git・GitHubのブランチ片付けられてますか?
私はまだ片付けられていません(今からやります)
年末年始の長期間お休みを挟むと、仕事の記憶もおぼろげになってしまいますよね、私は毎年そうです。(忘れないように来年の自分に向けたメモは残して休暇に入りたいですね。)
仕事始めに「これは何のブランチだっけ?いる?いらない?」とならないよう、今年のうちに整理してしまいましょう。
〜背景・準備編〜
なぜローカルブランチが片付かないのか
お掃除の説明に入る前に、課題背景について軽く整理します。
自分の手元のローカルブランチの増え方は大きく2通りあると思います。
- 自分のタスクで自分がローカル作業ブランチを作る
- ソースコードレビュー時に、チームメンバーが作ったブランチをpullする
タスクやレビューが終わった後、都度ブランチを消していけばいいのですが、つい放置してしまいがちです。
そして、いつの間にか増えてしまったローカルブランチを消していくのはとても面倒ですよね。
気づいたら、自分のローカルには様々な不要ブランチが残ってしまいます。
$ git branch
feature/aaa ← 自分の作業タスクブランチ
feature/bbb ← レビュー用にpullしたブランチ
feature/ccc
.
.
feature/xxx
develop
stg
main
リモートブランチを正として、ローカルブランチを整理する
そこで今回紹介するローカルブランチ整理法ですが、大原則として、リモートブランチを基準にします。
そのため、まずはGitHubにてリモートブランチを整理するところから始めてください。
- main
- develop
- stg
等、消してはいけない(設定で消せないようになっている)ブランチを除いて、Pull Requestがマージ済み・既にクローズされたようなリモートブランチを削除していきます。
*話は少し逸れますが、GitHubのbranch Protectionは忘れずに設定しておきましょう!
〜実施編〜
このコマンドを実行すると、現時点のリモートブランチとローカルブランチの状態を比較し、リモートで削除済みのローカルブランチを削除してくれます。
git fetch --prune && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D
実行結果例(test1とtest2をリモートリポジトリで削除後、コマンドを実行)
% git fetch --prune && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D
From github.com:${user}/{repository_name}
- [deleted] (none) -> origin/test1
Deleted branch test1 (was xxxxxx).
削除対象にカレントブランチが含まれていた場合、カレントブランチは削除されません
リモートブランチの追跡情報を参照した削除コマンドのため、ブランチの状態によっては削除対象に検出されないことがあります。
*git push origin HEADのように、-u無しでブランチをpushした場合は追跡情報が記録されません。
このコマンドは必ず一連のワンライナーとして実行してください。
git fetch --prune を事前に単独で実行してしまうと、リモート追跡ブランチ(origin/ブランチ名)が即座に削除されるため、その後に git branch -vv を実行しても [gone] 状態が検出できなくなります。
リポジトリごとにこのコマンドを1回打てば、不要ブランチの抽出〜削除まで1回で実行し、自分の手元のブランチを即時に整理することができます。
コマンドの解説
コマンドのくくりごとに解説すると、下記のようになります
-
git fetch --pruneで、リモートの最新情報を取得し、リモートで削除されたブランチの参照をローカルからも削除 -
git branch -vvで、ローカルブランチの一覧を詳細表示し、各ブランチのリモート追跡状態を確認 -
grep ': gone]'で、リモートブランチが削除済み(gone)のブランチのみを抽出 -
awk '{print $1}'で、抽出された行からブランチ名(1列目)のみを取り出し -
xargs git branch -Dで、取り出されたブランチ名を引数として受け取り、ローカルブランチを強制削除
エイリアスに登録する
この長いコマンドを覚えてられないので、エイリアスに設定しておきましょう。
私はpdというエイリアスを設定して、楽に実行しています。(prune deleteのキーワードの頭文字を取っています)
Gitコマンドのエイリアスにする場合
git config --global alias.pd '!git fetch --prune && git branch -vv | grep ": gone]" | awk "{print \$1}" | xargs git branch -D'
このエイリアス設定で、git pdで実行できます。
コマンドエイリアスにする場合
alias pd='git fetch --prune && git branch -vv | grep ": gone]" | awk "{print \$1}" | xargs git branch -D'
このエイリアス設定で、pdで実行できます。
ちなみに
思い切って特定のブランチ以外のローカルブランチをすべて消すコマンドはこちらです。
*特定のブランチ→mainとdevとstg以外の場合
git branch | grep -v "main\|dev\|stg\|^\*" | xargs git branch -D
さいごに
以上、超手軽なコマンドで自分のローカルブランチを整理する方法について紹介しました!
「最終的にxargsを使用してgit branch -Dの引数に渡してあげる」
前段のブランチ抽出方法を工夫すれば、別の条件でも簡潔にブランチ削除が可能になりますね。
それでは!自分の手元をきれいにしてから来年に望みましょう!
🎅🧹🍊