Featured image of post GitHub上でのmerge

GitHub上でのmerge

# GitHub上でのmerge

GitHub上で行えるmergeには3種類あります.

  • Create a merge commit
  • Squash and merge
  • Rebase and merge

これらは,「merge commitの有無」「merge commitのauthorが誰になるのか」などの点で微妙に異なります.

Commandmerge commitの有無merge commitのauthormerge元のbranchのcommit log
Create a merge commitmerge先残る
Squash and mergemerge元残らない
Rebase and merge残る

# Create a merge commit

「Create a merge commit」では,git merge --no-ffでmergeすることになります.つまり,merge先に新たなcommitが作成され,そのcommitがmerge元のcommitを取り込みます.このとき作成されるmerge commitのauthorはmerge先のauthorとして記録されます.

この方法は

  • 「何をmergeしたのか」がmerge commitという形で記録として残る
  • merge元のbranchがそのまま残るので変更箇所を追いやすい
  • merge後に,merge元のbranchを削除したとしても,このbranchのcommit logがmerge先に残る

という特徴があります.わかりやすい一方で,「merge commitのauthorがmerge元ではない」のが(個人的に)「その人の頑張りを讃えたいのになぁ」とか思っちゃったりしてちょっと申し訳ない気がするとかしないとか.

Create a merge commit

# Squash and merge

「Squash and merge」では,git merge --squashでmergeすることになります.つまり,merge元のcommitを一つのcommitにまとめた上で,merge先にmerge commitとして先頭に追加されます.このときのmerge commitのauthorはmerge元のauthorとなります.

この方法は

  • 「何をmergeしたのか」がmerge commitという形で記録として残る
  • 複数のcommitをまとめて一つにできるのでmerge先のcommit logがわかりやすい

という特徴があります.一方で,一度commitをまとめてしまうと,「どの変更が誰によってどのcommitで行われたのか」という情報が失われてしまうことになります.他の人の複数のcommitを一つのcommitに押し込むことになるので,個人的には若干怖さがあります.

Squash and merge

# Rebase and merge

「Rebase and merge」では,まずmerge元のブランチにあるcommit列に対してgit rebaseして,commit列が一列になったところでfast-forwardの形でmergeが実行されます.

この方法は

  • mergeした結果,merge先のcommit logが一直線で見やすい
  • merge commitが作成されない

という特徴があります.

Rebase and merge

# Reference

Hugo で構築されています。
テーマ StackJimmy によって設計されています。