git rebase
該命令同git merge解決的問題一樣件甥,這兩個(gè)命令都是將改動(dòng)從一個(gè)分支整合到另一個(gè)分支兑凿,但是實(shí)現(xiàn)方式不同孩擂。
例如:
developer在一個(gè)特定分支(Feature)上開發(fā)新功能喂窟,此時(shí)另一個(gè)小伙伴提交了一個(gè)新的commit更新了master分支赤赊,此時(shí)會(huì)導(dǎo)致分支分叉的歷史記錄,如果我們工作中使用git渊涝,那么應(yīng)該都會(huì)遇到這種情況。git分支圖如下:
此時(shí)床嫌,如果你的開發(fā)分支需要基于master最新的commit進(jìn)行開發(fā)跨释,有兩個(gè)選擇:merge或者rebase眨业。
merge
git checkout feature
git merge master
or
git merge feature master
這樣會(huì)在feature分支創(chuàng)建一個(gè)新的commit卜高,然后將兩個(gè)分支的歷史合并侥猩,git分支圖如下:
merging是一個(gè)沒有破壞性的操作您单,已存在的分支結(jié)構(gòu)不會(huì)被改變棒搜。
每次合并上游的改變時(shí)氯析,feature分支會(huì)有一個(gè)額外的merge commit弃锐。如果master分支非撑称蹋活躍,這樣feature分支會(huì)有很多歷史commit贯要。
rebase
另外一種方法是使用rebase:
git checkout feature
git rebase master
以上命令將所有的feature分支的改動(dòng)移動(dòng)到了master分支上暖侨,rebasing重寫了項(xiàng)目的歷史,而不是新創(chuàng)建一個(gè)merge commit崇渗。git分支圖如下:
rebasing的優(yōu)點(diǎn)是項(xiàng)目的歷史會(huì)更加整潔字逗。首先,它消除了不必要的merge commit宅广,其次rebasing會(huì)讓項(xiàng)目的分支呈線性葫掉,我們可以根據(jù)git log追溯項(xiàng)目的歷史改動(dòng)。
interactive rebasing
命令如下:
git checkout feature
git rebase -i master
此時(shí)會(huì)出現(xiàn)文本編輯界面跟狱,列出了所有commit的信息:
pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
你可以對(duì)該文本進(jìn)行編輯俭厚,例如如果commit#2僅僅在#1基礎(chǔ)上修復(fù)了小功能,那么可以將文本修改為:
pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
當(dāng)你關(guān)閉該文本時(shí)驶臊,git會(huì)按照你的指示執(zhí)行挪挤,rebase之后分支圖如下:
消除不重要的commit,自定義的調(diào)整項(xiàng)目歷史资铡。
rebasing的黃金法則
理解了rebasing之后电禀,需要知道什么時(shí)候一定不要使用它。
絕不要在公共分支使用rebasings孕荨<夥伞!