前言
學(xué)習(xí)git知識甥郑,《Pro Git》這本書很好,良心推薦荤西。
之前一直覺得git rebase是個很高級澜搅,很難理解的命令,其實了解它的原理后邪锌,會發(fā)現(xiàn)它其實很簡單易懂勉躺。
首先git rebase作用是整合來自不同分支的修改,跟它有相同作用的另外一個命令是git merge.
git rebase和git merge的區(qū)別
git rebase會修改倉庫的提交歷史觅丰,讓提交歷史變的很整潔饵溅;
git merge不會修改倉庫的提交歷史,能夠保留所有的提交痕跡妇萄,包括好的蜕企,壞的;
總的原則:只對尚未推送或者分享給別人的本地修改執(zhí)行變基操作清理歷史冠句,從不對已推送至別處的提交執(zhí)行變基操作轻掩。
變基的基本操作
目前開發(fā)任務(wù)分叉到兩個不同的分支,如下所示懦底,有master和experiment分支:
如果使用最容易整合分支的merge命令放典。它會把兩個分支的最新快照(C3和C4)以及二者的共同祖先(C2)進行三方合并,合并的結(jié)果是生成一個新的快照并提交基茵。
如果使用rebase的話奋构,可以提取C4中引入的補丁和修改,然后在C3的基礎(chǔ)上應(yīng)用一次拱层。使用rebase命令可以將提交到某一分支上的所有修改都移到另一分支上弥臼,就好像“重新播放”一樣。
在這個例子中根灯,可以檢出experiment分支径缅,然后將它變基到master分支上:
git checkout experiment
git rebase master
它的原理:首先找到這兩個分支的最近共同祖先C2掺栅,然后對比當前分支相對于該祖先的歷次提交,提取相應(yīng)的修改并存為臨時文件纳猪,然后將當前分支指向目標基底C3氧卧,最后以此將之前另存為臨時文件的修改依序應(yīng)用。
執(zhí)行結(jié)果如下:
再回到master分支氏堤,進行一次快進合并:
git checkout master
git merge experiment