チーム開発において、大きな機能開発をいきなり大きなPull Request(以下PR)を作るとレビューが大変です。
また、レビューの段階で設計的に良くない点が見つかって大きな書き直しに迫られることもあるかと思います。
このようなことはある程度規模の大きくなってきたアプリケーションに、複数の機能を並行して開発している経験があるならイメージが付きやすいと思います。
そんな作業途中のコミットログやレビューでの指摘事項の修正が、すべてmasterブランチのコミットログに残ってしまうのは格好わるいような気がします。
そんなときに今の会社に入って運用されているマージのルールがとても良かったのでメモしておきます。
Squash Mergeとは
GitHubには3つのマージ方法がある、ということを意識したことがある人はどれぐらいいるでしょうか?
▼をクリックすると、このようなメニューが開いてマージの方法を選択することができます。
そのうちの1つがSquash Mergeというもので、マージする際に途中のコミットログが消えて1つのコミットに集約されなおされます。
詳しくはこちらのGitHub公式ドキュメントやQiitaが参考になると思います。
ブランチの運用ルール
- master
- masterブランチ。本番へデプロイされる
- develop/XXXX
- 機能ブランチ。 masterへは「Create merge commit」 する
- work/XXXX/YYYY
- 作業ブランチ。 develop/XXXXから派生ブランチとして切る。 develop/XXXXへ「Squash and Merge する
workブランチではPRを作るとき派生元の積極的にコミットを積んでいってかまいません。レビューの指摘内容とかもここで積んでいくのが主です。PRを作るとき、ベースブランチは develop/XXXX を選びます。
最終的に、developにマージするとき、「Squash and Merge」を選ぶと developブランチの1つのコミットになります。
developブランチはmasterへマージされる前の最終確認的な運用をします。
このブランチのPRで指摘があった場合は、別途workブランチを切り直して修正したほうがコミットログがきれいでしょう。
最後に「Create merge commit」すると、 workブランチのPR単位のコミットログが並びます。
コミットグラフっぽいものを書いていくとこんな感じでしょうか。
◯[master]
|\
| ◯[develop/X] (まだコミットが積まれてないので本当は枝分かれしてないけどイメージ
| |\
| | ◯[work/X/Y1] wip
| | ◯ feat: 機能1のwork1
| | ◯ fix: 機能1のレビュー指摘事項の修正
developブランチとworkブランチを切って、workブランチで作業します。
develop/Xブランチに向かってPRを切り、workブランチをsquashマージします。
◯[master]
|\
| ◯ [develop/X] work1 (#1)
squashマージすると、develop/XブランチにPR1個分のコミットが1つのコミットとして積まれます。
次のworkブランチも切りましょう。
◯[master]
|\
| ◯[develop/X] work1 (#1)
| |\
| | ◯[work/X/Y2] feat: 機能1のwork2
work2のブランチもdevelop/XブランチにSquashマージします。
◯[master]
|\
| ◯[develop/X]
| |
| ◯ work1 (#1)
| |
| ◯ work2 (#2)
develop/Xブランチにwork2の作業内容が1コミットにまとめられて積まれます。
◯[master]
|\
| ◯[develop/X]
| |
| ◯ work1 (#1)
| |
| ◯ work2 (#2)
|/
◯[master] Merge pull request #3 from develop/X
最後にCreate commit and mergeすると、PR単位のコミットログだけが残ります!
コミットログが作業中のようなコメントではなく、PRに紐付いた1つのまとまりとしてコミットされるので、とても見通しがよいのではないでしょうか!
Squash Mergeなんて知らなかったよ、という私なので、とても感動したという話でした。
余談
マージ方法の選択は完全なる手動オペです。最後に選択してマージした方法が記録されるようです。
自動的に選択してもらう方法はないっぽい?なのでしばしば間違いが起こりますが、それについては特に気にしてない感じで運用してます。
うまいことやるとコミットログが綺麗になって気持ちいい、くらいですね。
間違えたからといって目くじらを立てているとつらくなってしまうかもしれません。
常に squash merge したいなら
常に squash merge でいいのであれば、リポジトリの設定でそれ以外のマージ方法を無効にしてしまう方法はありますね。
プルリクエストにコミットの squash を設定する - GitHub ヘルプ
@unarist
補足ありがとうございました!