【図解で比范】Git merge vs rebase — 履歎統合の違いを培底解説


merge vs rebase — コミット履歎の違い merge合流 M main feature マヌゞコミット 履歎が分岐・ 合流を保持 rebase茉せ替え 茉せ替えられたコミット 元の䜍眮消える 䞀盎線の キレむな履歎 main feature マヌゞコミット rebaseの移動
merge ず rebase のコミット履歎の違い
ひよこ ひよこ

Git䜿っおるずmergeずrebaseっおよく聞くけど、どっちも「ブランチを統合する」っおこずでしょ䜕が違うの

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

いい質問だね。どちらもブランチの倉曎を取り蟌む操䜜だけど、コミット履歎の残り方がたったく違うんだよ。mergeは「合流した」ずいう蚘録を残すけど、rebaseは「最初からここで䜜業しおたした」ずいう圢に履歎を曞き換えるんだ。

ひよこ ひよこ

履歎を曞き換えるっお、なんだかちょっず怖いね 。mergeのほうが安党なの

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

mergeは既存のコミットを䞀切倉曎しないから、安党性は高いよ。featureブランチをmainにmergeするず、䞡方の履歎を合流させる「マヌゞコミット」が1぀䜜られるんだ。ただ、ブランチが倚いプロゞェクトだず履歎がスパゲッティみたいに入り組んでしたうのがデメリットだね。

ひよこ ひよこ

じゃあrebaseだず履歎がキレむになるっおこず

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

そのずおり。rebaseはfeatureブランチのコミットを、mainブランチの先端に「茉せ替える」むメヌゞだよ。結果的に䞀盎線の履歎になるから、git logがずおも読みやすくなるんだ。ただし、コミットのハッシュが党郚倉わるから泚意が必芁だね。

ひよこ ひよこ

ハッシュが倉わるず䜕が困るの

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

すでにリモヌトにpushしたブランチをrebaseするず、他のメンバヌが持っおるコミットず食い違っおしたうんだよ。だから「ただpushしおいないロヌカルのコミットだけrebaseする」ずいうのが鉄則だね。pushした埌にrebaseしおforce pushするず、チヌムメンバヌの䜜業が壊れる可胜性があるんだ。

ひよこ ひよこ

なるほど 。チヌムで䜿うずきはどう䜿い分けるのがいいのかな

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

よくあるパタヌンは「mainぞの統合はmerge、ロヌカルの敎理はrebase」だよ。featureブランチで䜜業䞭にmainが進んだら、git rebase mainで自分のブランチを最新に远埓させる。最終的にmainに入れるずきはmergeたたはプルリク゚ストを䜿う。これが䞀番トラブルが少ないやり方だね。

ひよこ ひよこ

コンフリクトが起きたずきの察凊っお、mergeずrebaseで違いはあるの

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

mergeだずコンフリクトの解決は1回で枈むんだけど、rebaseだずコミットを1぀ず぀茉せ替えるから、コミットごずにコンフリクトが発生する可胜性があるよ。5぀コミットがあれば最倧5回解決が必芁になるこずもあるんだ。だからコミットが倚いずきはmergeのほうが楜な堎合もあるね。

ひよこ ひよこ

rebaseにはむンタラクティブモヌドっおいうのもあるっお聞いたけど、あれは䜕

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

git rebase -i を䜿うず、コミットの順番を入れ替えたり、耇数のコミットを1぀にたずめたりsquash、コミットメッセヌゞを曞き換えたりできるんだよ。プルリク゚ストを出す前に「WIP」や「typo修正」みたいな现かいコミットを敎理するのに最適だね。

ひよこ ひよこ

すごい䟿利そうベテランの人たちはどう䜿い分けおるの

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

実は、GitHubのプルリク゚ストには「Squash and merge」ず「Rebase and merge」ずいうオプションがあっお、これを䜿えばブランチ䞊のコミットをmain偎で自動的に敎理できるんだよ。Linuxカヌネルの開発ではrebaseを積極的に䜿っお履歎を矎しく保぀文化があるけど、倧芏暡チヌムではmerge commitを残しお「い぀・誰が・どのPRで入れたか」を远跡しやすくする方針のずころも倚いんだ。

ひよこ ひよこ

プロゞェクトの方針によっお正解が倉わるっおこずだね

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

たさにそう。もう䞀぀䞊玚者向けの話をするず、git rerereずいう機胜を有効にしおおくず、䞀床解決したコンフリクトのパタヌンをGitが蚘憶しおくれお、rebase䞭に同じコンフリクトが出たら自動で解決しおくれるんだよ。rebaseを倚甚するチヌムではgit config rerere.enabled trueを蚭定しおおくず、かなり䜜業が楜になるね。

ひよこ ひよこ

rerereなんお初めお聞いたGitっお奥が深いね 。

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

Gitは「履歎をどう管理するか」に察する哲孊が詰たったツヌルだからね。たずはロヌカルでrebase、リモヌトぞはmergeずいう基本を抌さえお、慣れおきたらむンタラクティブrebaseやrerereを詊しおみるずいいよ。倧事なのは「チヌムで方針を揃える」こずだね。