初めに
チーム開発では、機能A → 機能B → 機能C と、複数のブランチが“数珠つなぎ”で派生して進んでいくケースがよくあります。
しかし、私はまだエンジニア経験 2 ヶ月目で、日々Gitの運用方法に悩みながら開発しています。
・Bをマージする前にAをマージした方がいいのか
・squash mergeのときはどうすればいいのか
・rebaseするとforce pushが必要になってしまう(NGな現場も多い)
本記事では、実際に実験を行いながら “数珠つなぎブランチを main に正しく merge する方法” を整理しました!
未経験エンジニアの方たちの助けになればと思います。
ベースブランチの選択
baseのセレクトボックスをmainからbranchAに変更することでベースブランチにすることができます。
mainへのマージ方法
実際にマージ作業を行うとどのような挙動になるか、実際に試しながら調べてみました。
branchAからマージする方法
パターン1
- branchAをマージ後、branchAを削除
- branchBをマージ
branchBに「Base automatically changed from branchA to main」と表示され、
ベースブランチがmainになります。
そのままbranchBをマージすればmainに無事マージされます。
パターン2
- branchAを修正(branchBと干渉する箇所)
- branchAをマージ後、 branchAを削除
- branchBをマージ
branchAの時にbranchBに干渉する箇所を編集したところ、branchB上でコンフリクトが発生しました。
またこの時ベースブランチはパターン1と同じくmainになります。

この場合、コンフリクト解消のために、ローカル上でmainをbranchBにマージしてからもう一度pushする必要があります。
下記がコンフリクトを解消する手順です。
git switch main
git pull
git switch branchB
git merge main (この時コンフリクト発生、解消作業が必要)
git push origin head
コンフリクトが解消されれば、無事mainにマージすることが可能です。

パターン3(squash merge)
パターン1と同じ手順でsquash mergeの場合
- branchAをマージ後、branchAを削除
- branchBをマージ
squash mergeだとコミット履歴が変わるため、branchBにbranchAのコミット履歴が付随するようになります。
また、branchAを編集しようがしまいが、必ずコンフリクトが発生するみたいです。

↓
branchAをマージ後、削除した時のbranchBの状況

コンフリクト解消のために、パターン2と同じ手順を実施します。
すると無事mainにマージできるようになります。
branchBからマージする方法
branchBからマージする方法もあったため、こちらも試していきます。
パターン4
- branchAを修正
- branchBに発生したコンフリクト解消
- branchBをマージ
- branchAをマージ
branchAを編集した場合、下記のようにコンフリクトが発生します。

このコンフリクトを解消するためには以下のコマンドを実行していきます。
git switch branchB
git merge branchA(コンフリクト解消作業)
git push origin head
すると、branchBのコンフリクトが解消されるため、マージができるようになります。

また、branchAが下記のようにbranchBのコミット履歴がつくようになり、無事mainにマージすることができるようになります。

このパターンのやり方はsquash mergeでも同じようにmainにマージすることができます!
branchBをsquash mergeするとbranchAでは以下のようになりmainにマージ可能

終わりに
今回はbranchの数珠繋ぎを行った時にmainにマージする方法をいくつか試してみました。
初めてマージ作業を任されたときは、この方法で合っているだろうかと心配になりましたが、今回実験を行ったことで、githubの扱いに少し自信がついてきました。
同じくgithubの扱いに不安を抱える方に少しでも役立てればと思います!


