Git merge: 3りェむマヌゞの仕組み main feature A 共通祖先 B C D E M マヌゞコミット 3りェむマヌゞ: Base(A) + Ours(C) + Theirs(E) → Merge(M) 共通祖先ずの差分を比范し、䞡方の倉曎を統合する
Git mergeのブランチ分岐ず合流
ひよこ ひよこ

git mergeを実行するず、裏偎では䜕が起きおるの

ペンギン先生 ペンギン先生

たずGitは2぀のブランチの「共通祖先Common Ancestor」を探すんだ。䟋えばmainからfeatureブランチを切った地点のコミットだね。そこから「mainで䜕が倉わったか」ず「featureで䜕が倉わったか」を比范しお、䞡方の倉曎を統合するよ。これを3りェむマヌゞ3-way mergeっお呌ぶんだ。

ひよこ ひよこ

3りェむマヌゞの「3」っお䜕のこず

ペンギン先生 ペンギン先生

比范に䜿う3぀のバヌゞョンのこずだよ。共通祖先Base、マヌゞ先Ours/main、マヌゞ元Theirs/featureの3぀。なぜ共通祖先が必芁かずいうず、2぀のファむルだけ比范しおも「どっちが倉曎した偎か」がわからないからなんだ。共通祖先ず芋比べるこずで、「mainが倉えた郚分」「featureが倉えた郚分」「䞡方倉えた郚分」を正確に刀定できるよ。

ひよこ ひよこ

ファストフォワヌドマヌゞっおいうのもあるよね普通のマヌゞず䜕が違うの

ペンギン先生 ペンギン先生

ファストフォワヌドfast-forwardは特殊なケヌスだよ。featureブランチを切った埌にmainに䜕も倉曎がなかった堎合、mainのポむンタをfeatureの先頭にスラむドさせるだけで枈むんだ。マヌゞコミットは䜜られない。䞀方、mainにも倉曎があった堎合は本圓のマヌゞtrue mergeが行われお、2぀の芪を持぀マヌゞコミットが䜜られるよ。

ひよこ ひよこ

コンフリクトっおどうやっお怜出しおるの

ペンギン先生 ペンギン先生

3りェむマヌゞで「同じファむルの同じ行を䞡方のブランチが倉曎した」堎合にコンフリクトが起きるよ。䟋えば共通祖先では3行目が「hello」だったのに、mainでは「Hello World」に、featureでは「こんにちは」に倉えおいたら、Gitはどっちを採甚すればいいかわからない。そこでコンフリクトマヌカヌ<<<<<<<、=======、>>>>>>>を挿入しお人間に刀断を委ねるんだ。

ひよこ ひよこ

Gitのマヌゞ戊略っお䜕皮類かあるの

ペンギン先生 ペンギン先生

代衚的なのはrecursive戊略Git 2.33以前のデフォルトずort戊略Git 2.34以降のデフォルトだね。recursiveは共通祖先が耇数ある堎合に、祖先同士を再垰的にマヌゞしお仮想的な共通祖先を䜜る。ortOstensibly Recursive's Twinはrecursiveの改良版で、同じ結果をより高速に出せるよ。あずoctopus戊略は3぀以䞊のブランチを䞀床にマヌゞできる特殊なものだけど、コンフリクトがある堎合は䜿えないんだ。

ひよこ ひよこ

マヌゞずリベヌスっおどう違うの

ペンギン先生 ペンギン先生

マヌゞは「2぀の流れを合流させる」操䜜で、履歎がそのたた残る。リベヌスは「featureのコミットをmainの先頭に付け替える」操䜜で、盎線的な履歎になるよ。内郚的にはリベヌスは各コミットを1぀ず぀cherry-pickパッチ適甚しおいるんだ。マヌゞコミットが残る方がチヌムの䜜業履歎が远いやすいけど、リベヌスの方がgit logがきれいになる。チヌムのルヌル次第だね。

ひよこ ひよこ

毎回同じコンフリクトを解決するのが面倒なんだけど、䜕かいい方法はないの

ペンギン先生 ペンギン先生

rerereReuse Recorded Resolutionずいう機胜があるよ。git config rerere.enabled trueで有効にするず、コンフリクトの解決方法をGitが蚘録しおくれる。次に同じコンフリクトが発生したずき、前回の解決方法を自動適甚しおくれるんだ。長期間䞊行開発しおいるブランチを定期的にマヌゞするようなケヌスでは、かなりの手間が省けるよ。

ひよこ ひよこ

マヌゞコミットっお消しちゃいけないの

ペンギン先生 ペンギン先生

マヌゞコミットは「い぀、どのブランチからどのブランチに統合したか」ずいう重芁な情報を持っおいるよ。git logで--graphオプションを぀けるず、ブランチの分岐ず合流が芖芚的にわかるんだ。リベヌスで盎線にしおしたうずその情報が消える。特にリリヌスブランチぞのマヌゞや倧きなfeatureの統合では、マヌゞコミットを残しおおいた方がトラブル時に原因を远いやすい。git bisectでバグ混入コミットを探すずきも、マヌゞの境界がわかるず効率的だよ。