分支開(kāi)發(fā)工作流
現(xiàn)在你已經(jīng)學(xué)會(huì)新建和合并分支伤极,那么你可以或者應(yīng)該用它來(lái)做些什么呢谎懦? 在本節(jié)鲫咽,我們會(huì)介紹一些常見(jiàn)的利用分支進(jìn)行開(kāi)發(fā)的工作流程签赃。而正是由于分支管理的便捷,才衍生出這些典型的工作模式分尸,你可以根據(jù)項(xiàng)目實(shí)際情況選擇一種用用看锦聊。
長(zhǎng)期分支
因?yàn)?Git 使用簡(jiǎn)單的三方合并,所以就算在一段較長(zhǎng)的時(shí)間內(nèi)箩绍,反復(fù)把一個(gè)分支合并入另一個(gè)分支孔庭,也不是什么難事。 也就是說(shuō)材蛛,在整個(gè)項(xiàng)目開(kāi)發(fā)周期的不同階段圆到,你可以同時(shí)擁有多個(gè)開(kāi)放的分支;你可以定期地把某些特性分支合并入其他分支中卑吭。
許多使用 Git 的開(kāi)發(fā)者都喜歡使用這種方式來(lái)工作芽淡,比如只在 master
分支上保留完全穩(wěn)定的代碼——有可能僅僅是已經(jīng)發(fā)布或即將發(fā)布的代碼。 他們還有一些名為 develop
或者 next
的平行分支豆赏,被用來(lái)做后續(xù)開(kāi)發(fā)或者測(cè)試穩(wěn)定性——這些分支不必保持絕對(duì)穩(wěn)定挣菲,但是一旦達(dá)到穩(wěn)定狀態(tài),它們就可以被合并入 master
分支了掷邦。 這樣白胀,在確保這些已完成的特性分支(短期分支,比如之前的 iss53
分支)能夠通過(guò)所有測(cè)試抚岗,并且不會(huì)引入更多 bug 之后纹笼,就可以合并入主干分支中,等待下一次的發(fā)布苟跪。
事實(shí)上我們剛才討論的廷痘,是隨著你的提交而不斷右移的指針蔓涧。 穩(wěn)定分支的指針總是在提交歷史中落后一大截,而前沿分支的指針往往比較靠前笋额。
Figure 26. 漸進(jìn)穩(wěn)定分支的線(xiàn)性圖
通常把他們想象成流水線(xiàn)(work silos)可能更好理解一點(diǎn),那些經(jīng)過(guò)測(cè)試考驗(yàn)的提交會(huì)被遴選到更加穩(wěn)定的流水線(xiàn)上去兄猩。
Figure 27. 漸進(jìn)穩(wěn)定分支的流水線(xiàn)(“silo”)視圖
你可以用這種方法維護(hù)不同層次的穩(wěn)定性。 一些大型項(xiàng)目還有一個(gè) proposed
(建議) 或 pu: proposed updates
(建議更新)分支枢冤,它可能因包含一些不成熟的內(nèi)容而不能進(jìn)入 next
或者 master
分支鸠姨。 這么做的目的是使你的分支具有不同級(jí)別的穩(wěn)定性;當(dāng)它們具有一定程度的穩(wěn)定性后淹真,再把它們合并入具有更高級(jí)別穩(wěn)定性的分支中讶迁。 再次強(qiáng)調(diào)一下,使用多個(gè)長(zhǎng)期分支的方法并非必要核蘸,但是這么做通常很有幫助巍糯,尤其是當(dāng)你在一個(gè)非常龐大或者復(fù)雜的項(xiàng)目中工作時(shí)。
特性分支
特性分支對(duì)任何規(guī)模的項(xiàng)目都適用客扎。 特性分支是一種短期分支祟峦,它被用來(lái)實(shí)現(xiàn)單一特性或其相關(guān)工作。 也許你從來(lái)沒(méi)有在其他的版本控制系統(tǒng)(VCS
)上這么做過(guò)徙鱼,因?yàn)樵谀切┌姹究刂葡到y(tǒng)中創(chuàng)建和合并分支通常很費(fèi)勁宅楞。 然而,在 Git 中一天之內(nèi)多次創(chuàng)建袱吆、使用厌衙、合并、刪除分支都很常見(jiàn)杆故。
你已經(jīng)在上一節(jié)中你創(chuàng)建的 iss53
和 hotfix
特性分支中看到過(guò)這種用法迅箩。 你在上一節(jié)用到的特性分支(iss53
和 hotfix
分支)中提交了一些更新,并且在它們合并入主干分支之后处铛,你又刪除了它們饲趋。 這項(xiàng)技術(shù)能使你快速并且完整地進(jìn)行上下文切換(context-switch)——因?yàn)槟愕墓ぷ鞅环稚⒌讲煌牧魉€(xiàn)中,在不同的流水線(xiàn)中每個(gè)分支都僅與其目標(biāo)特性相關(guān)撤蟆,因此奕塑,在做代碼審查之類(lèi)的工作的時(shí)候就能更加容易地看出你做了哪些改動(dòng)。 你可以把做出的改動(dòng)在特性分支中保留幾分鐘家肯、幾天甚至幾個(gè)月龄砰,等它們成熟之后再合并,而不用在乎它們建立的順序或工作進(jìn)度。
考慮這樣一個(gè)例子换棚,你在 master
分支上工作到 C1
式镐,這時(shí)為了解決一個(gè)問(wèn)題而新建 iss91
分支,在 iss91
分支上工作到 C4
固蚤,然而對(duì)于那個(gè)問(wèn)題你又有了新的想法娘汞,于是你再新建一個(gè) iss91v2
分支試圖用另一種方法解決那個(gè)問(wèn)題,接著你回到 master
分支工作了一會(huì)兒夕玩,你又冒出了一個(gè)不太確定的想法你弦,你便在 C10
的時(shí)候新建一個(gè) dumbidea
分支,并在上面做些實(shí)驗(yàn)燎孟。 你的提交歷史看起來(lái)像下面這個(gè)樣子:
Figure 28. 擁有多個(gè)特性分支的提交歷史
現(xiàn)在,我們假設(shè)兩件事情:你決定使用第二個(gè)方案來(lái)解決那個(gè)問(wèn)題揩页,即使用在 iss91v2
分支中方案旷偿;另外,你將 dumbidea
分支拿給你的同事看過(guò)之后碍沐,結(jié)果發(fā)現(xiàn)這是個(gè)驚人之舉狸捅。 這時(shí)你可以?huà)仐?iss91
分支(即丟棄 C5
和 C6
提交)衷蜓,然后把另外兩個(gè)分支合并入主干分支累提。 最終你的提交歷史看起來(lái)像下面這個(gè)樣子:
Figure 29. 合并了 dumbidea
和 iss91v2
分支之后的提交歷史
我們將會(huì)在 分布式 Git 中向你揭示更多有關(guān)分支工作流的細(xì)節(jié)磁浇,因此斋陪,請(qǐng)確保你閱讀完那個(gè)章節(jié)之后,再來(lái)決定你的下個(gè)項(xiàng)目要使用什么樣的分支策略(branching scheme)置吓。
請(qǐng)牢記无虚,當(dāng)你做這么多操作的時(shí)候,這些分支全部都存于本地衍锚。 當(dāng)你新建和合并分支的時(shí)候友题,所有這一切都只發(fā)生在你本地的 Git 版本庫(kù)中 —— 沒(méi)有與服務(wù)器發(fā)生交互。