Git 2.56.0で追加された git branch --delete-merged を試す
はじめに
Git 2.56.0 で追加された git branch --delete-merged が追加されました。
ブランチを整理するとき、複数のコマンドを組み合わせて削除していました。
git branch --merged main | grep -v 'main' | xargs git branch -d
このオプションを使うと、上流ブランチとマージ状態を条件にして削除できるようです。
今回はマージ済みのローカルブランチをまとめて削除する手順を試します。
どのブランチが対象になる?
次の通りです。
git branch --delete-merged <upstream-pattern>
指定したパターンに一致する上流ブランチを追跡していて、現在のブランチにマージ済みのローカルブランチが削除対象になります。
削除対象を表示するだけなら --dry-run を付けて確認できます。
git branch --delete-merged 'main' --dry-run
また、末尾にブランチ名のパターンを追加すると、対象をさらに絞り込むこともできます。
git branch --delete-merged 'main' 'feature-*' --dry-run
これは、上流が main に一致し、現在のブランチにマージ済みで、ブランチ名が feature-* に一致するブランチを表示します。
パターンはシェルに展開されないよう、引用符で囲みます。
試すためのブランチを作る
git --version
2.56.0 以降であることを確認し、main から2つのブランチを作ります。
今回は試すだけなので、何も変更せずに空のコミットで行います。
git switch main
git switch -c feature-demo
git commit --allow-empty -m "feature demo commit"
git switch main
git switch -c topic-demo
git commit --allow-empty -m "topic demo commit"
上流ブランチを設定する
この例では、2つのローカルブランチの上流をローカルの main に設定します。
git branch --set-upstream-to=main feature-demo
git branch --set-upstream-to=main topic-demo
git branch -vv の表示で、各ブランチに [main] と出ていることを確認します。
git branch -vv
feature-demo 489868f [main: ahead 1] feature demo commit
main 9195eca Merge branch 'demo2'
* topic-demo 1a767aa [main: ahead 1] topic demo commit
上流ブランチはローカルブランチが追跡する相手を表す設定です。
GitHubなどの開発では、たとえばローカルの feature/login ブランチが、リモート追跡ブランチ origin/feature/login を上流として追跡します。
この場合、上流のパターンには origin/feature/* を指定できます。
今回の例では --delete-merged の条件を分かりやすくするために、ローカルの main を上流にしています。
main にマージ後、 dry-run で確認して削除する
git switch main
git merge feature-demo
git merge topic-demo
上流が main のブランチを確認します。
git branch --delete-merged 'main' --dry-run
Would delete branch topic-demo (was 1a767aa).
Would delete branch feature-demo (was 489868f).
Would delete branch ... と表示されたブランチが削除候補です。
ブランチ名でも絞るなら、たとえば次のようにします。
git branch --delete-merged 'main' 'feature-*' --dry-run
Would delete branch feature-demo (was 489868f).
この手順では feature-demo のみが候補になります。
表示を確認したら、--dry-run を外して実行します。
git branch --delete-merged 'main' 'feature-*'
Deleted branch feature-demo (was 489868f).
削除結果は次のように確認できます。
git branch -vv
* main 6816ae3 Merge branch 'topic-demo'
topic-demo 1a767aa [main: behind 2] topic demo commit
feature-* と絞っているので、topic-demo は削除されず、feature-demoだけが消えていることが確認できました。
まとめ
この --delete-merged オプションが増えたことで複数のコマンドを組み合わせるより、1つのコマンドで解決できる点は良さそうです。
ただ、実際どれだけ嬉しいかはいまのところわからないです。
詳しい仕様は git-branch の Git 2.56.0 マニュアル を参照してください。
Discussion