4囊嘉、GitFlow 工作流(最流行)
Gitflow工作流沒(méi)有用超出上面功能分支工作流的概念和命令,而是為不同的分支,分配一個(gè)很明確的角色柱宦,并定義分支之間如何交互,和什么時(shí)候進(jìn)行交互播瞳。
-
除了有master主分支(用于存儲(chǔ)正式發(fā)布的歷史版本)外掸刊,還有一個(gè)作為功能集成分支的develop分支。
當(dāng)初始化完成后赢乓,某個(gè)程序員想要開發(fā)一個(gè)功能忧侧,并不是直接從master分支上拉出新分支,而是使用develop分支作為父分支來(lái)拉出新分支牌芋。
當(dāng)新功能完成后蚓炬,再合并回父分支,新功能的提交并不與master分支直接交互躺屁。
-
一旦develop分支上有了做一次發(fā)布(或者說(shuō)快到了既定的發(fā)布日)的足夠功能肯夏,就從develop分支上checkout一個(gè)發(fā)布分支。
新建的發(fā)布分支用于開始發(fā)布循環(huán)犀暑,所以從這個(gè)時(shí)間點(diǎn)開始之后新的功能驯击,不能再加到這個(gè)分支上,該分支只應(yīng)該做Bug修復(fù)耐亏、文檔生成和其它面向發(fā)布任務(wù)余耽。
一旦對(duì)外發(fā)布的工作都完成了,發(fā)布分支合并到master分支苹熏,并分配一個(gè)版本號(hào)打好Tag碟贾。
另外,這些從新建發(fā)布分支以來(lái)的做的修改轨域,要合并回develop分支上袱耽。
-
維護(hù)分支或說(shuō)是熱修復(fù)(hotfix)分支用于,快速給產(chǎn)品發(fā)布版本(production releases)打補(bǔ)丁干发,這是唯一可以直接從master分支fork出來(lái)的分支朱巨。
修復(fù)完成,修改應(yīng)該馬上合并回master分支和develop分支(當(dāng)前的發(fā)布分支)枉长,master分支應(yīng)該用新的版本號(hào)打好Tag冀续。
為Bug修復(fù)使用專門分支,讓團(tuán)隊(duì)可以快速處理掉問(wèn)題必峰,而不用打斷其它工作或是等待下一個(gè)發(fā)布循環(huán)洪唐。
你可以把維護(hù)分支想成是一個(gè)直接在master分支上處理的臨時(shí)發(fā)布。
總結(jié)就是:Gitflow
工作流通過(guò)為功能開發(fā)吼蚁、發(fā)布準(zhǔn)備和維護(hù)設(shè)立了獨(dú)立的分支凭需,讓發(fā)布迭代過(guò)程更流暢,充分的利用了分支的特點(diǎn)。嚴(yán)格的分支模型也為大型項(xiàng)目提供了一些非常必要的結(jié)構(gòu)粒蜈。
下圖是完整的Gitflow
工作流開發(fā)方式圖顺献,但實(shí)際開發(fā)工作環(huán)境可能會(huì)精簡(jiǎn):
Gitflow工作流總結(jié):
適用人群:任何開發(fā)團(tuán)隊(duì),熟悉Git分支的團(tuán)隊(duì)枯怖。
-
工作方式:
- 項(xiàng)目維護(hù)者創(chuàng)建項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)注整,創(chuàng)建master分支與develop分支,貢獻(xiàn)者可讀不可寫度硝。
- 每個(gè)貢獻(xiàn)者
git clone
遠(yuǎn)程倉(cāng)庫(kù)中的develop分支到本地倉(cāng)庫(kù)肿轨。(記住,develop分支相當(dāng)于master的分支塘淑,包括功能開發(fā),修改蚂斤,測(cè)試存捺。master分支相當(dāng)于最終分支) - 每個(gè)貢獻(xiàn)者在本地倉(cāng)庫(kù)創(chuàng)建自己的feature分支,在feature分支上開發(fā)曙蒸。
- 在feature分支又可以創(chuàng)建多個(gè)feature分支捌治,繼續(xù)開發(fā)項(xiàng)目。
- 每個(gè)貢獻(xiàn)者每次開發(fā)完成就
git commit
到本地倉(cāng)庫(kù)中自己的feature分支纽窟, 接著git push
到遠(yuǎn)程倉(cāng)庫(kù)肖油。 - 通過(guò)
pull request
提醒項(xiàng)目維護(hù)者,瀏覽貢獻(xiàn)者提交feature分支臂港。 - 項(xiàng)目維護(hù)者把feature分支拉下來(lái)森枪,然后合并到自己本地倉(cāng)庫(kù)的develop分支上測(cè)試。
- 組長(zhǎng)測(cè)試feature分支通過(guò)之后审孽,由組長(zhǎng)負(fù)責(zé)把feature分支合并到遠(yuǎn)程倉(cāng)庫(kù)的develop分支上县袱。
- 項(xiàng)目維護(hù)者會(huì)release分支上
git tag
打上版本號(hào)。 - 項(xiàng)目維護(hù)者可以從develop分支創(chuàng)建release分支佑力,接著把release分支合并到master分支上式散,同時(shí)master分支同步到develop分支。
- 項(xiàng)目維護(hù)者在遠(yuǎn)程倉(cāng)庫(kù)把合并過(guò)的feature分支刪除打颤。
- 每個(gè)貢獻(xiàn)者在本地倉(cāng)庫(kù)把合并過(guò)的feature分支刪除暴拄。
- 每個(gè)貢獻(xiàn)者將本地倉(cāng)庫(kù)分支切換為develop分支,然后
git pull
將本地倉(cāng)庫(kù)的master分支更新到遠(yuǎn)程倉(cāng)庫(kù)的develop分支版本编饺。
PS:Gitflow工作流是
Vincent Driessen
工程師提出的多分支工作流乖篷。
5、Forking 工作流(偶爾使用)
分叉(Forking)工作流也可以叫做分布式工作流透且,是在 GitFlow工作流的基礎(chǔ)上的衍生那伐,充分利用了Git在分支和克隆上的優(yōu)勢(shì),再加上pull request
的功能,以達(dá)到代碼審核的目的罕邀。既可以管理大團(tuán)隊(duì)的開發(fā)者(developer)的提交畅形,也可以接受不信任貢獻(xiàn)者(contributor)的提交。
這種工作流使得每個(gè)開發(fā)者都有一個(gè)服務(wù)端倉(cāng)庫(kù)(此倉(cāng)庫(kù)只有自己可以push推送诉探,但是所有人都可以pull拉取修改)日熬,每個(gè)程序員都push代碼到自己的服務(wù)端倉(cāng)庫(kù),但不能push到正式倉(cāng)庫(kù)肾胯,只有項(xiàng)目維護(hù)者才能push到正式倉(cāng)庫(kù)竖席,這樣項(xiàng)目維護(hù)者可以接受任何開發(fā)者的提交,但無(wú)需給他正式代碼庫(kù)的寫權(quán)限敬肚。
這種工作流適合開源社區(qū)的開源項(xiàng)目毕荐,大家統(tǒng)一對(duì)項(xiàng)目做貢獻(xiàn),但是有一個(gè)人或一個(gè)團(tuán)隊(duì)作為開發(fā)者來(lái)管理項(xiàng)目艳馒,所有的貢獻(xiàn)者的代碼由開發(fā)者審核憎亚,其功能完善之后再由開發(fā)者push到正式倉(cāng)庫(kù)中。
總結(jié):
- 分叉(Forking)工作流更適合安全可靠地管理大團(tuán)隊(duì)的開發(fā)者弄慰,而且能接受不信任貢獻(xiàn)者的提交第美。
- 在實(shí)際工作中,如果偶爾有需要團(tuán)隊(duì)外的成員幫我們解決問(wèn)題時(shí)陆爽,可能會(huì)用到什往。
- 這種工作流程并不常用,只有當(dāng)項(xiàng)目極為龐雜慌闭,或者需要多級(jí)別管理時(shí)别威,才會(huì)體現(xiàn)出優(yōu)勢(shì)。 利用這種方式驴剔,項(xiàng)目總負(fù)責(zé)人(即主管)可以把大量分散的集成工作兔港,委托給不同的小組負(fù)責(zé)人分別處理,然后在不同時(shí)刻將大塊的代碼子集統(tǒng)籌起來(lái)仔拟,用于之后的整合衫樊。
提示:
- 每個(gè)成員都可以從中央版本庫(kù)中拉取代碼。
- 每級(jí)成員都只能向上一級(jí)提交代碼利花。
- 上一級(jí)合并代碼之后繼續(xù)向上級(jí)提交代碼科侈。
- 最后只有獨(dú)裁者才能向中央版本庫(kù)提交代碼。
分叉工作流(分布式倉(cāng)庫(kù)工作流)總結(jié):
適用人群:大型開發(fā)團(tuán)隊(duì)炒事,熟悉Git分支的團(tuán)隊(duì)臀栈。
-
工作方式:
主項(xiàng)目維護(hù)者創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù),創(chuàng)建一個(gè)master分支挠乳,從項(xiàng)目維護(hù)者可讀不可寫权薯。
從項(xiàng)目維護(hù)者通過(guò)fork主項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)的副本姑躲,到自己的遠(yuǎn)程倉(cāng)庫(kù),包括master分支盟蚣。(記住黍析,從項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)獨(dú)立于主項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù))
從項(xiàng)目維護(hù)者
git clone
主項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)的副本到本地倉(cāng)庫(kù)。從項(xiàng)目維護(hù)者創(chuàng)建自己的feature分支屎开,在feature分支上開發(fā)翻伺。
從項(xiàng)目維護(hù)者每次開發(fā)完成就
git commit
到本地倉(cāng)庫(kù)中自己的feature分支驹马, 接著git push
到遠(yuǎn)程倉(cāng)庫(kù)赏表。通過(guò)
pull request
命令叫搁,從項(xiàng)目維護(hù)者合并自己feature分支,到從項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)的master分支上逞度。從項(xiàng)目維護(hù)者在遠(yuǎn)程倉(cāng)庫(kù)把合并過(guò)的feature分支刪除额划。
從項(xiàng)目維護(hù)者在本地倉(cāng)庫(kù)把合并過(guò)的feature分支刪除。
從項(xiàng)目維護(hù)者在遠(yuǎn)程倉(cāng)庫(kù)通過(guò)
pull request
向主項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)的推送档泽。主項(xiàng)目維護(hù)者通過(guò)
pull request
獲取從項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)的推送俊戳。主項(xiàng)目維護(hù)者進(jìn)行從項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)代碼審查,測(cè)試茁瘦。
主項(xiàng)目維護(hù)者確認(rèn)無(wú)誤后品抽,可以直接合并到主項(xiàng)目維護(hù)者的遠(yuǎn)程倉(cāng)庫(kù)储笑。
6甜熔、總結(jié)
上面介紹了在Git分布式系統(tǒng)中經(jīng)常使用的工作流程,但是在實(shí)際的開發(fā)中突倍,你會(huì)遇到許多可能適合你的特定工作流程的變種腔稀,你可以按照實(shí)際的情況,靈活的進(jìn)行組合和拓展羽历。
參考: