GitHub の3種類のMergeまとめ

Web上でPRをマージする際に選択可能な3つのマージ方法をまとめました。

Create a merge commit

  • ファストフォワード無効オプション適用のマージになる git merge --no-ff
  • マージコミットが生成される
  • マージコミットの親コミットは2つ(分岐元の最新と分岐先の最新)
  • 分岐先のコミットは分岐元に取り込まれる
    • 分岐先ブランチが消えてもコミットは残る

Rebase and merge

  • 分岐先のコミットと同じ内容のクローンコミットが生成されて、分岐元にマージされる
  • 新しいコミットは分岐元の最新コミットからの分岐になるので、マージされるとファストフォワードになる
  • 履歴は一本になる

Squash and merge

  • 分岐先のコミットを1つにまとめたコミットが生成されて、分岐元にマージされる
  • 新しいコミットは分岐元の最新コミットからの分岐になるので、マージされるとファストフォワードになる
  • 1PR1コミットになる
  • コミッタが分岐元にマージした人になる(GitHubだとnoreply@gihub.com)

注意点

  • develop -> main などの同じ分岐元、分岐先のマージを複数回行うような場合には、RebaseやSquashは使わない
    • 差分を含むコミットが毎回作り直される為、毎回同じコミットが差分として検出されてしまう
    • main -> develop にマージしていない場合はコンフリクトが多発する

参考