Skip to content
Latchkey

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/checkout

conflictが起きるとき

両方の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へゲートする場所です。

関連ガイド