W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在 Git 中整合來(lái)自不同分支的修改主要有兩種方法:merge
以及 rebase
。在本節(jié)中我們將學(xué)習(xí)什么是“變基”,怎樣使用“變基”,并將展示該操作的驚艷之處,以及指出在何種情況下你應(yīng)避免使用它。
請(qǐng)回顧之前在 “分支的合并” 中的一個(gè)例子,你會(huì)看到開(kāi)發(fā)任務(wù)分叉到兩個(gè)不同分支,又各自提交了更新。
Figure 3-28. 通過(guò)合并操作來(lái)整合分叉了的歷史
其實(shí),還有一種方法:你可以提取在 C4
中引入的補(bǔ)丁和修改,然后在 C3
的基礎(chǔ)上再應(yīng)用一次。在 Git 中,這種操作就叫做 變基。你可以使用 rebase
命令將提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一樣。
在上面這個(gè)例子中,運(yùn)行:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
它的原理是首先找到這兩個(gè)分支(即當(dāng)前分支 experiment
、變基操作的目標(biāo)基底分支 master
)的最近共同祖先 C2
,然后對(duì)比當(dāng)前分支相對(duì)于該祖先的歷次提交,提取相應(yīng)的修改并存為臨時(shí)文件,然后將當(dāng)前分支指向目標(biāo)基底 C3
, 最后以此將之前另存為臨時(shí)文件的修改依序應(yīng)用。(譯注:寫明了 commit id,以便理解,下同)
Figure 3-30. master 分支的快進(jìn)合并
此時(shí),C4'
指向的快照就和上面使用 merge
命令的例子中 C5
指向的快照一模一樣了。這兩種整合方法的最終結(jié)果沒(méi)有任何區(qū)別,但是變基使得提交歷史更加整潔。你在查看一個(gè)經(jīng)過(guò)變基的分支的歷史記錄時(shí)會(huì)發(fā)現(xiàn),盡管實(shí)際的開(kāi)發(fā)工作是并行的,但它們看上去就像是先后串行的一樣,提交歷史是一條直線沒(méi)有分叉。
一般我們這樣做的目的是為了確保在向遠(yuǎn)程分支推送時(shí)能保持提交歷史的整潔——例如向某個(gè)別人維護(hù)的項(xiàng)目貢獻(xiàn)代碼時(shí)。在這種情況下,你首先在自己的分支里進(jìn)行開(kāi)發(fā),當(dāng)開(kāi)發(fā)完成時(shí)你需要先將你的代碼變基到 origin/master
上,然后再向主項(xiàng)目提交修改。這樣的話,該項(xiàng)目的維護(hù)者就不再需要進(jìn)行整合工作,只需要快進(jìn)合并便可。
請(qǐng)注意,無(wú)論是通過(guò)變基,還是通過(guò)三方合并,整合的最終結(jié)果所指向的快照始終是一樣的,只不過(guò)提交歷史不同罷了。變基是將一系列提交按照原有次序依次應(yīng)用到另一分支上,而合并是把最終結(jié)果合在一起。
在對(duì)兩個(gè)分支進(jìn)行變基時(shí),所生成的“重演”并不一定要在目標(biāo)分支上應(yīng)用,你也可以指定另外的一個(gè)分支進(jìn)行應(yīng)用。就像 Figure?3-31 中的例子這樣。你創(chuàng)建了一個(gè)特性分支 server
,為服務(wù)端添加了一些功能,提交了 C3
和 C4
。然后從 C3
上創(chuàng)建了特性分支 client
,為客戶端添加了一些功能,提交了 C8
和 C9
。最后,你回到 server
分支,又提交了 C10
。
Figure 3-32. 截取特性分支上的另一個(gè)特性分支,然后變基到其他分支
現(xiàn)在可以快進(jìn)合并 master
分支了。(如圖 Figure?3-33):
$ git checkout master
$ git merge client
Figure?3-35 中的樣子:
$ git branch -d client
$ git branch -d server
Figure 3-36. 克隆一個(gè)倉(cāng)庫(kù),然后在它的基礎(chǔ)上進(jìn)行了一些開(kāi)發(fā)
然后,某人又向中央服務(wù)器提交了一些修改,其中還包括一次合并。你抓取了這些在遠(yuǎn)程分支上的修改,并將其合并到你本地的開(kāi)發(fā)分支,然后你的提交歷史就會(huì)變成這樣:
Figure 3-38. 有人推送了經(jīng)過(guò)變基的提交,并丟棄了你的本地開(kāi)發(fā)所基于的一些提交
結(jié)果就是你們兩人的處境都十分尷尬。如果你執(zhí)行 git pull
命令,你將合并來(lái)自兩條提交歷史的內(nèi)容,生成一個(gè)新的合并提交,最終倉(cāng)庫(kù)會(huì)如圖所示:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: