git作為現(xiàn)在熱門(mén)的代碼版本管理工具绞灼,在現(xiàn)在各大公司已被廣泛應(yīng)用唱蒸。但你對(duì)git的認(rèn)識(shí)和熟悉程度有多深入呢。 鄙人認(rèn)為git是值得深入探索和研究的础芍,而不是停留在簡(jiǎn)單的pull杈抢、push的使用中。本文主要結(jié)合我在項(xiàng)目中的經(jīng)驗(yàn)詳細(xì)對(duì) git rebase
(變基)闡述一下者甲。
認(rèn)識(shí)git rebase
rebase提供了一種在你合并代碼到主干時(shí)一種有別于merge的方式春感。我們都知道我們?cè)谥苯邮褂?code>git merge合并代碼時(shí)會(huì)出現(xiàn)多個(gè)分叉,并且有可能再你落后他人分支時(shí)會(huì)保留一個(gè)無(wú)意義的合并記錄虏缸,這使得代碼記錄很亂鲫懒,git 圖表則會(huì)雜亂無(wú)章。而正好git rebase
則可提供一條完美的線(xiàn)性提交記錄刽辙。
用法
git rebase有兩種用法用得比較多窥岩。
一、用來(lái)改寫(xiě)提交到版本庫(kù)的commit
二宰缤、用來(lái)在合并代碼到主干時(shí)颂翼,將基底提前,合并后使得主線(xiàn)保持一條干凈完美的線(xiàn)性慨灭,便于代碼審閱人員review code朦乏。
基于第一種情況,假設(shè)我們當(dāng)前在feature/develop當(dāng)我們?cè)诮K端執(zhí)行
git rebase -i <commit id>
此時(shí)終端會(huì)喚起vim界面氧骤,顯示的是最近提交的commt歷史記錄呻疹,注意:前開(kāi)后閉即是(chose commit id, last commit id]其實(shí)你可通過(guò)鍵入i <insert>更改commit歷史,我們可將pick改為squash或者fixup,然后鍵入:wq保存退出vim編輯器筹陵。然后你在git log
查看歷史記錄刽锤,則會(huì)發(fā)現(xiàn)合并了提交,并且會(huì)出現(xiàn)一個(gè)新的commit id朦佩。記住并思,這會(huì)丟棄合并區(qū)間的commit id,重新生成一個(gè)新的commit id语稠。熟悉git的朋友可能發(fā)覺(jué)這很像git commit --amend
宋彼,的確這起到的作用和其大同小異。
基于第二種情況仙畦,假設(shè)我們當(dāng)前在feature/develop输涕,且我們的分支的base已經(jīng)落后于master我們想要在合并master時(shí)先在終端執(zhí)行
git rebase master
這時(shí)會(huì)開(kāi)始git rebase的進(jìn)程,一旦遇到出現(xiàn)沖突议泵,rebase進(jìn)程將被終止占贫,我們此時(shí)可以選擇解決沖突繼續(xù)rebase桃熄,也可終止這次rebase操作先口。
前者型奥,我們需要在解決沖突后在終端執(zhí)行
git add <flename>
git rebase --continue
繼續(xù)我們此次rebase進(jìn)程,直到完成所有文件的rebase碉京。我們則在切換到master執(zhí)行merge工作厢汹,
git checkout master
git merge feature/develop
然后我們需要強(qiáng)推到master
git push -f origin master
而此時(shí)也是fast-forward模式。來(lái)看一下rebase之后的log graph谐宙,是不是看起來(lái)很美呢烫葬?
后者的話(huà)我們可以執(zhí)行
git rebase --abort
來(lái)終止這次rebase進(jìn)程,此時(shí)將回到我們r(jià)ebase前的狀態(tài)凡蜻。
不用force push應(yīng)遵守
在push到遠(yuǎn)程master時(shí)搭综,
- 先checkout到本地master分支上fetch origin/master
- 再在checkout到feature分支上rebase master分支
- 再在checkout到master分支merge feature分支
- 最后git push到遠(yuǎn)程master
風(fēng)險(xiǎn)
當(dāng)在rebase公共分支時(shí)要特別注意,因?yàn)檫@極大可能給你的團(tuán)隊(duì)帶來(lái)災(zāi)難性的后果划栓。因?yàn)楫?dāng)你rebase多人一起開(kāi)發(fā)的公共分支時(shí)兑巾,執(zhí)行force push時(shí),因?yàn)闀?huì)改變commit id忠荞,則當(dāng)你同事在merge代碼則會(huì)出現(xiàn)沖突蒋歌,可能會(huì)導(dǎo)致代碼的丟失,所以我們要特別注意這一點(diǎn)委煤。
永遠(yuǎn)不要衍合那些已經(jīng)推送到公共倉(cāng)庫(kù)的更新堂油。
如果你遵循這條金科玉律,就不會(huì)出差錯(cuò)碧绞。否則府框,人民群眾會(huì)仇恨你,你的朋友和家人也會(huì)嘲笑你头遭,唾棄你寓免。
后記
總得來(lái)說(shuō),git rebase是個(gè)很nice的用來(lái)管理git倉(cāng)庫(kù)的命令计维,適用于團(tuán)隊(duì)多人開(kāi)發(fā)時(shí)袜香,而且有review code需要時(shí)使用。放心鲫惶,雖然存在風(fēng)險(xiǎn)蜈首,但我們有git reflog
來(lái)解決這些災(zāi)難性操作。