はじめに
GitHub を使ってブランチをマージするときには 3 つの選択肢がある。
- Create a merge commit
- Rebase and merge
- Squash and merge
仕事では Create a merge commit を使うことが多いが、個人開発では Squash and merge を使った場合の面倒事が発生することが少ないため、master ブランチにちょっとした修正のコミット履歴を残さないように Squash and merge を使うことがある。
Squash and merge を使ったときの面倒事についてはググると記事が見つかるのでそちらを参照して欲しい。
- Git の Squash マージをやめた話 - Mobile Factory Tech Blog
- 【開発】スカッシュマージを卒業しプロダクトを加速させるブランチ戦略へ | SocialDog Tech Blog
Squash and merge した後にコンフリクトが発生する問題については、rebase するときのオプションで解決できるらしい。
- Git で squash merge 後に merge されたコミットを含む branch がコンフリクトするのを解決する #onto - Qiita
- squash merge の環境で Cascading PRs でコンフリクトした時 - oinume journal
しかし、マージ済みブランチを削除するとき -d
ではなく -D
で消さなければいけない。定期的に git pull --prune
してローカルのマージ済みブランチも掃除しているのでコマンド一発でマージ済みブランチを消せないのは不便に感じる。
--no-ff
の場合
Create a merge commit でマージしたときは次の alias を ~/.config/git/config
に設定しているので git delete-merged-branch
コマンドでマージ済みブランチを削除している。
このエイリアスは以下の記事を参考に develop
、main
、master
ブランチを保護するようにしたものだ。
しかし、これだと Squash and merge でマージしたブランチが消えない問題がある。
Squash and merge に対応したい
ググってみると方法は 4 つ見つかった。
- seachicken/gh-poi: ✨ Safely clean up your local branches
- not-an-aardvark/git-delete-squashed: Delete branches that have been squashed and merged into main
- teppeis/git-delete-squashed: Delete branches that have been squashed and merged into master
- GitHub で Squash merge されたブランチを削除する · ryym.log
一つ目は gh
コマンドの拡張として開発されている poi、二つ目と三つ目は npx を使って実行できる Node パッケージとして配布されている git-delete-squashed、四つ目は git-delete-squashed をシェルスクリプトで実装したものになっている。
gh-poi
今回は poi を試してみる。 gh コマンドを使うので最初にログインする。
gh コマンドを使ったことがない方は Installation を参考にインストールしてください。
ログインできたら gh-poi をインストールする。
Squash マージ済みのブランチを消すためのコマンド gh poi
を実行すると次のようになった。
確かに Squash マージしたブランチを削除できた。 git-delete-squashed と違って GitHub の PR 情報を元に Squash マージ済みのブランチか否かを判定しているようだ。
GitHub からデータを取得するのはいまいちな気もするがしばらく使ってみる。問題があれば git-delete-squashed も試してみたい。