【Github】Github ~ Merge / Squash / Rebase ~

◾️はじめに

マージでトラブルがあったので、Merge周辺のことを調べてみた

目次

【0】前提知識
 1)Squash
 2)Rebase
【1】Github の PR のマージ方法
 1)Create a merge commit
 2)Squash and merge
 3)Rebase and merge
【2】メリット・デメリット
 1)Create a merge commit
 2)Squash and merge
 3)Rebase and merge
【3】Github上でのマージ方法に関する設定あれこれ
 1)マージ方法の強制/許可/無効化
 2)ブランチごとでの設定
【4】補足:Githubのブランチ履歴調査

【0】前提知識

1)Squash

* 複数のコミットを1つのコミットにまとめる操作

cf. Squash (スクウォッシュ?スカッシュ?) = 押しつぶす。(名) カボチャ、スカッシュ

2)Rebase

* 別ブランチの内容をブランチの後ろに付け替える操作
  => 指定したコミットを、ブランチを変えて作り直す操作

cf. rebase (リベース) = 付け替え

 => 詳細は以下の関連記事を参照の事

Git ~ 基本編 / マージ・リベース ~
https://dk521123.hatenablog.com/entry/2019/06/10/200917

【1】Github の PR のマージ方法

* Github の Pull request (PR) のマージは、以下の3種類。

1)Create a merge commit
2)Squash and merge
3)Rebase and merge

1)Create a merge commit

* マージコミットを作成して、マージ
=> マージコミットのイメージは、以下の公式ドキュメント参照

https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#merge-your-commits

Gitコマンド

# Non Fast-Forward マージ
git merge --no-ff

2)Squash and merge

* PRに含まれるコミットを1つにまとめる。
* その後、そのコミットをマージ先のbaseブランチへマージ
=> Squashのイメージは、以下の公式ドキュメント参照

https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits

Gitコマンド

# Squash マージ
git merge --squash

3)Rebase and merge

* PRに含まれるコミットをマージ先ブランチに追加
* このとき、マージコミットは作られず、コミットが個々に追加

Gitコマンド

# Fast-Forward マージ
git merge --ff-only

【2】メリット・デメリット

1)Create a merge commit

メリット

* マージコミットができるので、Revert しやすい
* すべてのコミットログが残るため、コードの意図の調査をしやすい

デメリット

* マージコミットが大量に発生する

一口メモ

* 「すべてのコミットログが残る」はメリットであり、
 デメリット「マージコミットが大量に発生する」でもある

2)Squash and merge

メリット

* マージコミットができるので、 Revert しやすい
* 単一コミットにまとめられるので、コミットログがシンプルになる

デメリット

* 詳細なコミット履歴が失われる
* コンフリクトが発生する場合がある
 => 詳細は、以下のサイトを参照のこと

https://tech.mobilefactory.jp/entry/2023/11/29/160000

3)Rebase and merge

メリット

* 履歴が単純になる

デメリット

* 元のコミットから変更内容が変更される
* rebaseはコミットが改変されてしまうため、 元に戻せなくなるかも、、、
* コンフリクトが発生した場合、複数回コンフリクト解消をしなければならない

https://www.zoma-blog.com/post/other/git/20230222_git_rebase_avoid/
https://zenn.dev/yumiyoshi/scraps/37723d020d4541

【3】Github上でのマージ方法に関する設定あれこれ

1)マージ方法の強制/許可/無効化

* 以下に記載されている

https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/configuring-commit-squashing-for-pull-requests

より抜粋
~~~~~
リポジトリでの GitHub.com 上のすべての pull request のマージに対する
コミットのスカッシュを、強制、許可、または無効化できます
~~~~~

# Squash だけでなく3種類の方法を設定でコントロールできる

Github の 各種設定 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/07/11/131849

の「【1】Pull-Request」の以下の項目で管理。
Rules Explanations Default Memo
Allow merge commits マージコミット許容 Yes
Allow squash merging スカッシュマージ許容 Yes
Allow rebase merging リベースマージ許容 Yes

2)ブランチごとでの設定

* マージコミットの禁止(Squash・Rebaseの強制)であれば、
 以下の関連記事の「Require linear history」で可能

Github の 各種設定 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/07/11/131849
Require linear history
https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches#require-linear-history

直線状のコミット履歴を強制すると、
コラボレータがブランチにマージコミットをプッシュすることを防げます。 
つまり、保護されたブランチにマージされたプルリクエストは、
squash マージまたはリベースマージを使用する必要があります。

【4】補足:Githubのブランチ履歴調査

* 以下でグラフィカルに確認できる

https://github.com/<GithubAccount>/<RepositoryName>/network

関連記事

Git ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/06/29/104028
Git ~ 基本編 / マージ・リベース ~
https://dk521123.hatenablog.com/entry/2019/06/10/200917
Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github ~ Milestone ~
https://dk521123.hatenablog.com/entry/2025/04/20/233920
Github の 各種設定 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/07/11/131849