🌿

Git 2.56.0で追加された git branch --delete-merged を試す

に公開

はじめに

Git 2.56.0 で追加された git branch --delete-merged が追加されました。

https://about.gitlab.com/ja-jp/blog/whats-new-in-git-2-56-0/#git-branch1でマージ済みブランチを削除する

ブランチを整理するとき、複数のコマンドを組み合わせて削除していました。

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 マニュアル を参照してください。

GitHubで編集を提案

Discussion