之前開(kāi)的坑來(lái)補(bǔ)。
如何利用 Git 的團(tuán)隊(duì)協(xié)作是個(gè)問(wèn)題游昼,處理不好會(huì)讓工作事倍功半是牢。
我在學(xué)習(xí)的過(guò)程中了解到了4種 Git 團(tuán)隊(duì)協(xié)作的方式斯稳。
1.中心化工作流
2.基于功能分支的工作流
3.Gitflow 工作流
4.Fork 工作流
中心化工作流
中心化工作流將中央倉(cāng)庫(kù)作為項(xiàng)目中所有修改的唯一入口。這種工作流不需要 master 之外的其他分支庄萎。
如何工作
開(kāi)發(fā)者將中央倉(cāng)庫(kù) clone 到本地后開(kāi)始工作踪少。在他們的本地倉(cāng)庫(kù)中,可以修改文件和提交更改糠涛,但是秉馏,所有新的提交都保存在本地,和中央倉(cāng)庫(kù)完全隔離脱羡。開(kāi)發(fā)者可以將 upstream 的同步推遲到他們方便的時(shí)候去做萝究。
管理沖突
在開(kāi)發(fā)者發(fā)布功能之前,需要先 fetch 更新到最新到中央倉(cāng)庫(kù)锉罐,在它們之上 rebase 自己到更改帆竹。 這樣的優(yōu)點(diǎn)是可以留下完美的線性歷史。
這套協(xié)作方式對(duì)于 SVN 的使用團(tuán)隊(duì)來(lái)說(shuō)很棒脓规,但是沒(méi)有用到 Git 分布式的優(yōu)點(diǎn)栽连。
Feature 分支工作流
當(dāng)你熟練使用 Git 之后,在你的開(kāi)發(fā)流程中添加功能分支是一個(gè)非常能促進(jìn)團(tuán)隊(duì)協(xié)作的方式。
這種工作流的好處是秒紧,多個(gè)開(kāi)發(fā)者專(zhuān)注自己的功能而不會(huì)打擾中央倉(cāng)庫(kù)绢陌。還能保證 master 分支永遠(yuǎn)不會(huì)包含質(zhì)量有問(wèn)題的代碼,給持續(xù)集成環(huán)境帶來(lái)了很大好處熔恢。
封裝功能的開(kāi)發(fā)方式使得 Pull Request 的使用更加方便脐湾。它可以在開(kāi)發(fā)者在功能并入項(xiàng)目之前一起參與討論,提出問(wèn)題叙淌,或者尋求建議秤掌。
如何工作
Feature 分支工作流同樣使用中央倉(cāng)庫(kù)的概念,master 分支代表官方的項(xiàng)目歷史鹰霍。開(kāi)發(fā)者每次進(jìn)行新的工作時(shí)闻鉴,創(chuàng)建一個(gè)新的分支,該分支名稱(chēng)應(yīng)為描述功能或者針對(duì)某一 issue 茂洒。
feature 分支也應(yīng)該被推送到中央倉(cāng)庫(kù)孟岛。這使得你和其他開(kāi)發(fā)者共享這個(gè)功能,而又不會(huì)改變官方代碼督勺。
Pull Request 是分支工作流里非常便利的工具蚀苛,有人如果完成了一個(gè)功能,他們不會(huì)立刻并入master玷氏。他們將 feature 分支推送到中央倉(cāng)庫(kù)發(fā)布一個(gè) Pull Request 堵未。這樣可以在并入主代碼庫(kù)之前讓所有其他開(kāi)發(fā)者審查代碼。Pull Request 也是一個(gè)討論板塊盏触,任何人遇到問(wèn)題需要幫助時(shí)可以發(fā)起一個(gè) Pull Request 讓其他開(kāi)發(fā)者看到渗蟹。
GitFlow 工作流
GitFlow工作流相比功能分支工作流沒(méi)有增加新的概念,它給不同的分支制定的不同的功能赞辩,嚴(yán)格定義了它們應(yīng)該怎樣以及何時(shí)進(jìn)行交流雌芽。
開(kāi)發(fā)分支
對(duì)于一個(gè)開(kāi)發(fā)人員來(lái)說(shuō),開(kāi)發(fā)分支是打交道最多的分支辨嗽。每增加一個(gè)功能世落,就在開(kāi)發(fā)分支的基礎(chǔ)上新建一個(gè)功能分支,每當(dāng)功能開(kāi)發(fā)完成時(shí)糟需,它會(huì)杯合并會(huì)開(kāi)發(fā)分支屉佳。功能分支 永遠(yuǎn)不應(yīng)該跟 master 交互。
發(fā)布分支
一旦 開(kāi)發(fā)分支的新功能開(kāi)發(fā)到一定程度(deadline 或者 其他原因)洲押,你可以從 開(kāi)發(fā)分支 fork 出來(lái)一個(gè)分支發(fā)布武花。這個(gè)分支的創(chuàng)建開(kāi)始了下一個(gè)發(fā)布周期。只有和發(fā)布有關(guān)的工作應(yīng)該在詞分支上進(jìn)行杈帐。
發(fā)布完成后体箕,發(fā)布分支將合并進(jìn) master专钉,并打上版本號(hào)標(biāo)簽。另外也應(yīng)該合并回 develop 累铅,后者可能在發(fā)布啟動(dòng)后又有了新的改動(dòng)跃须。
通常使用一個(gè)專(zhuān)門(mén)的分支來(lái)準(zhǔn)備確保一個(gè)團(tuán)隊(duì)修復(fù)當(dāng)前發(fā)布的功能,其他團(tuán)隊(duì)可以開(kāi)發(fā)下一個(gè)發(fā)布的功能娃兽。
維護(hù)分支
維護(hù)分支 (hotfix)用來(lái)緊急給產(chǎn)品的發(fā)布打上布丁菇民,這是唯一可以從 master 上 fork 的分支。修復(fù)完成后换薄,它們應(yīng)該被并入 master 和 develop 分支玉雾。
實(shí)際的工作流程翔试,則需要根據(jù)上面規(guī)則和實(shí)際情況進(jìn)行詳細(xì)的規(guī)劃轻要。
Fork 工作流
Fork 工作流不同與其他幾個(gè)工作流。這個(gè)工作流可以讓每個(gè)開(kāi)發(fā)者都擁有一個(gè)服務(wù)端倉(cāng)庫(kù)垦缅。也就是說(shuō)每個(gè)貢獻(xiàn)者都有兩個(gè)Git倉(cāng)庫(kù)冲泥,一個(gè)開(kāi)放的服務(wù)端倉(cāng)庫(kù),和私有的倉(cāng)庫(kù)壁涎。
Fork 工作流的主要有點(diǎn)在于代碼可以輕易的整合進(jìn)項(xiàng)目凡恍,而不需要每個(gè)人都推送到單一的中央倉(cāng)庫(kù)。開(kāi)發(fā)者推送他們自己的服務(wù)端倉(cāng)庫(kù)怔球,只有項(xiàng)目管理者可以推送到官方倉(cāng)庫(kù)嚼酝。這使得管理者可以結(jié)束任何開(kāi)發(fā)者的提交,卻不需要給他們中央倉(cāng)庫(kù)的權(quán)限竟坛。
在工作項(xiàng)目中闽巩,本源規(guī)定了一套 Git Flow 工作流,后來(lái)因?yàn)殚_(kāi)發(fā)者只有我一個(gè)人(partner在比較閑的時(shí)候時(shí)不時(shí)會(huì)來(lái)貢獻(xiàn)幾個(gè)功能)担汤,并且沒(méi)有 中央代碼庫(kù) 的權(quán)限涎跨。所以后來(lái)就逐漸轉(zhuǎn)變成了 Fork 工作流。
相比前三個(gè)工作流崭歧,F(xiàn)ork 工作流使用起來(lái)更簡(jiǎn)單隅很,且最安全。因?yàn)樨暙I(xiàn)代碼的人并不干擾中央倉(cāng)庫(kù)率碾,只通過(guò) Pull Request 來(lái)和中央代碼庫(kù)進(jìn)行交互叔营,最適用的場(chǎng)景就是開(kāi)源倉(cāng)庫(kù),和松散型的開(kāi)發(fā)團(tuán)隊(duì)使用所宰。
以上就是在和 Partner 尋找有效的工作方式時(shí)审编,學(xué)習(xí)到的 Git 團(tuán)隊(duì)工作流程。以后如果遇到其他新奇的工作流程會(huì)再補(bǔ)充更新歧匈。