注:接下來(lái)的演示操作仍將以SourceTree這個(gè)可視化工具為例。
個(gè)人感覺(jué)rebase這個(gè)功能有點(diǎn)多余,其實(shí)merge操作已經(jīng)覆蓋了它的功能??赡芫褪菫榱俗屨麄€(gè)commit看起來(lái)更順暢一下,沒(méi)有那么多的旁路分支,不那么雜亂。雖然個(gè)人不是很喜歡這個(gè)功能,但是很多開(kāi)源庫(kù)的作者再你提pr的時(shí)候都會(huì)要求你rebase到它最新的master分支上,這樣作者評(píng)審代碼的時(shí)候可能會(huì)更方便。
所以在這里給大家介紹下如何將某個(gè)分支rebase到另外一個(gè)分支上。
操作步驟
假如有如下的分支結(jié)構(gòu),我們希望將test分支rebase到master分支上。
-
首先需要確保master和test分支的代碼都是最新的代碼(沒(méi)事git pull一下),而且當(dāng)前分支是test分支。
-
然后,我們?cè)趍aster的M-A 這次提交上,右鍵點(diǎn)擊【Rebase children of xxx interfactively】,如下圖:
在這里我們可以選擇是否需要將4次commit合并為1次commit,如果需要?jiǎng)t點(diǎn)擊【Squash with previous】即可,具體操作可見(jiàn)這篇文章的第11小節(jié)。不合并就直接點(diǎn)擊OK,如下圖:
點(diǎn)擊之后一般都會(huì)有沖突,如下:
不用擔(dān)心,點(diǎn)擊Close關(guān)閉彈框即可,然后使用source tree解決沖突。在這里有一點(diǎn)需要特別注意:
rebase解決沖突時(shí),與我們常規(guī)的merge解決沖突的Theris和Mine是反的。即這里的Theirs代碼的是test分支上的內(nèi)容,Mine代表的是master分支上的內(nèi)容 -
解決完沖突之后,不要進(jìn)行commit,保持你是如下這樣的頁(yè)面:
-
然后打開(kāi)git命令行工具,可以看到提示說(shuō):所有沖突都解決了,請(qǐng)使用
git rebase --continue
命令。
那我們就輸入這個(gè)命令即可,如何提示還是有沖突那就繼續(xù)解決。當(dāng)所有的沖突都解決完了,git會(huì)告訴我們r(jià)ebase已經(jīng)成功了,如下圖:
此時(shí)我們就可以看到現(xiàn)在的test已經(jīng)rebase到了master上(只是本地rebase好了,還并沒(méi)有推送到遠(yuǎn)端哦): -
但是這里又需要我們特別注意:git告訴我們本地的test分支與遠(yuǎn)端的test分支不一致,需要我們先把那5個(gè)提交pull下來(lái),這里一定不要pull,否則就會(huì)額外多了一個(gè)merge操作。 ( 不過(guò)如果你的test分支遠(yuǎn)端不存在的話(huà)(都是自己本地提交的),則不會(huì)有這個(gè)問(wèn)題,在這里直接
git push
上去就行。)
所以在這里使用git push --force
直接強(qiáng)推上去。 -
rebase完成。
Q&A
Q1: 如果我之前已經(jīng)習(xí)慣了使用merge,我自己的test分支上有很多提交都是從其它分支上merge過(guò)來(lái)的,而且已經(jīng)解決了不少的提交?,F(xiàn)在要rebase到master上肯定這些沖突還會(huì)再次出現(xiàn),只能一個(gè)個(gè)手動(dòng)解決嗎?
A: 非也。首先從master merge到test上(確保后續(xù)的rebase沖突可以很好解決),然后基于當(dāng)前test創(chuàng)建一個(gè)臨時(shí)分支,將這個(gè)臨時(shí)分支rebase上去。創(chuàng)建臨時(shí)分支的操作如這里的3.1小節(jié)所介紹。這里簡(jiǎn)單解釋下操作(首先保證當(dāng)前分支為test分支):
//創(chuàng)建臨時(shí)分支
git checkout --orphan tmp
//添加所有并提交
git add .
git commit -m "創(chuàng)建臨時(shí)分支并本地提交"
最后,將tmp分支rebase到master即可,你會(huì)發(fā)現(xiàn)沖突很好解決,基本使用【Resolve using “Theirs”】就可以。
Q2: SourceTree這里的rebase是什么意思?與下面的rebase有什么區(qū)別?
A2: 本質(zhì)行一樣,沒(méi)什么區(qū)別。下面的哪一個(gè)功能更豐富一點(diǎn),可以讓我們選擇是否要【Edit Message】和【Squash commits】。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-758373.html
Q3: rebase過(guò)程中,后悔了咋弄?不想rebase了。
A3: 執(zhí)行git rebase --abort
就行,恢復(fù)的干干凈凈,不會(huì)影響你的代碼。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-758373.html
到了這里,關(guān)于【Git】如何使用sourcetree進(jìn)行rebase操作(變基)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!