【まーじ】

マージ(Git) とは?

最終更新:
💡 指定した履歴と変更を、今のブランチへ取り込む

Gitで、指定したコミットやブランチの履歴と変更を、現在のブランチへ取り込む操作。履歴の関係や指定したオプションによって、ブランチの先端を進めたり、複数の親を持つマージコミットを作ったりする。

📌 このページのポイント
二つの親を持つマージコミット main feature A B C D M mainの新しい先端 Mの親はBとD 線は履歴のつながりを示す fast-forwardではMを作らない
左右は古い履歴から新しい履歴への並びです。分岐した二つの履歴をマージコミットMで結ぶ例を示しています。線は履歴の関係で、変更データの転送矢印ではありません。
ひよこ ひよこ
どちらのブランチが変更されるの?
ペンギン先生 ペンギン先生
例えばmainに切り替えてgit merge featureを実行すると、featureの変更をmainへ取り込むよ。取り込む先は現在のブランチだ。feature側のブランチを自動で削除する操作ではないんだ。
ひよこ ひよこ
fast-forwardって、コミットをコピーするの?
ペンギン先生 ペンギン先生
現在の先端が取り込みたいコミットの祖先なら、その先端へブランチの指す位置を進められるよ。これがfast-forwardで、新しいマージコミットは作らない。既にある履歴へ進むので、コミットを作り直して積む操作ではないんだ。
ひよこ ひよこ
両方の履歴が進んでいたら?
ペンギン先生 ペンギン先生
通常は両方の先端を親に持つマージコミットで履歴を結ぶよ。共通の祖先と、それぞれの変更を踏まえて結果を作る。fast-forwardできる場合でも、--no-ffでマージコミットを作る指定はできるんだ。
ひよこ ひよこ
コンフリクトは、片方を選べば解決?
ペンギン先生 ペンギン先生
自動で統合できない変更があると止まるよ。同じ行の変更だけでなく、ファイルの削除と変更などでも起こる。意図に合わせて両方を組み合わせる場合もあるので、片方を選ぶだけとは限らない。解消した内容を確認してから完了するんだ。
ひよこ ひよこ
エラーなしでマージできたら、確認は不要?
ペンギン先生 ペンギン先生
自動で統合できても、組み合わせたコードが意図どおり動くかは別だよ。差分や動作を確認する。また--squashは統合した結果を作るけれど、マージコミットの履歴は記録しない。オプションによる違いも踏まえて作業しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「マージ」って出てきたら「Gitで別の履歴と変更を、今のブランチへ取り込む操作」と思えばだいたいOK!
📖 おまけ:英語の意味
「merge」 = 合流する・統合する
💬 分かれたものを合わせるという意味だよ。Gitではmain以外のブランチにも取り込めるので、常に本番へ反映する操作ではないんだ。

参考資料

← 用語集にもどる