Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@fruitriin

大きな機能開発を細かくレビューしてもらうときに使いたいGitHubのSquash Merge

チーム開発において、大きな機能開発をいきなり大きなPull Request(以下PR)を作るとレビューが大変です。
また、レビューの段階で設計的に良くない点が見つかって大きな書き直しに迫られることもあるかと思います。
このようなことはある程度規模の大きくなってきたアプリケーションに、複数の機能を並行して開発している経験があるならイメージが付きやすいと思います。

そんな作業途中のコミットログやレビューでの指摘事項の修正が、すべてmasterブランチのコミットログに残ってしまうのは格好わるいような気がします。
そんなときに今の会社に入って運用されているマージのルールがとても良かったのでメモしておきます。

Squash Mergeとは

GitHubには3つのマージ方法がある、ということを意識したことがある人はどれぐらいいるでしょうか?
スクリーンショット 2020-06-03 2.16.49.png
▼をクリックすると、このようなメニューが開いてマージの方法を選択することができます。
そのうちの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

補足ありがとうございました!

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
studist
「伝えることを、もっと簡単に」をミッションにビジュアルSOPマネジメントプラットフォームのBtoB SaaS「Teachme Biz」を開発・運営するスタートアップ

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?