Git mergeとは?
mergeは2つのbranchの履歴を結合し、一方の変更を他方へ取り込み、それらがどう合流したかを記録します。
mergeは、branchで行われた作業がmainのラインへ再合流する手段です。Gitは2つのbranchを見て、その共通の祖先を特定し、変更を結合します。ほとんどのmergeは何事もなく進みますが、Gitが何をしているかを理解しておくと、conflictが現れたときやCIゲートがmergeをブロックしたときに役立ちます。
mergeの仕組み
Gitは2つのbranchの共通の祖先を見つけ、その時点以降に各側が行った変更を適用します。片側だけが進んでいた場合は、単にポインタを移動するだけでfast-forwardできます。両側が進んでいた場合は、両方のbranch tipを親に持つ新しいmerge commitを作成します。
実際のmerge
mergeし込みたいbranchへ切り替え、それからもう一方のbranchをmergeします。
Merging a feature into main
git switch main
git merge feature/checkoutconflictが起きるとき
両方のbranchが同じ行を非互換な形で変更した場合、Gitは自動的に判断できず、conflictとともに一時停止します。マークされた領域を編集し、結果をstageし、mergeを完了することで解決します。ほとんどのmergeはconflictしません。特にbranchが短命な場合はそうです。
mergeとCI/CD
pull requestワークフローでは、mergeは新しいコードがmainのbranchに入る瞬間なので、品質を強制する自然な場所です。必須のstatus checkはCIが通るまでmergeを不可能にし、mainへのmergeはしばしばdeployをトリガーします。branchだけでなくmergeされた結果をtestするツールは、結合後にのみ現れる問題を捉えます。
mergeをクリーンに保つ
- 頻繁にmergeまたはrebaseして、branchをmainの近くに保つ。
- branchだけでなく、mergeの結果をCIに検証させる。
- 必須のcheckを使い、赤い状態で何もmergeされないようにする。
- 小さなpull requestを好み、conflictをまれで小さく保つ。
重要なポイント
- mergeは2つのbranchを結合し、fast-forwardするかmerge commitを作成します。
- conflictは、両側が同じ行を非互換に変更したときにのみ発生します。
- CI/CDでは、mergeはstatus checkがコードをmainへゲートする場所です。
関連ガイド
What Is a Git Branch?What is a Git branch? Learn how branches are lightweight movable pointers, how they enable parallel work, and…
What Is a Merge Conflict?What is a merge conflict? Understand why conflicts happen, how to read conflict markers, how to resolve them,…
What Is a Fast-Forward Merge?What is a fast-forward merge? An explainer on how Git simply moves a pointer when no divergence exists, the l…