Git 分布式工作流程

2018-09-27 15:43 更新

同傳統(tǒng)的集中式版本控制系統(tǒng)(CVCS)不同,開發(fā)者之間的協(xié)作方式因著 Git 的分布式特性而變得更為靈活多樣。在集中式系統(tǒng)上,每個開發(fā)者就像是連接在集線器上的節(jié)點,彼此的工作方式大體相像。而在 Git 網(wǎng)絡中,每個開發(fā)者同時扮演著節(jié)點和集線器的角色,這就是說,每一個開發(fā)者都可以將自己的代碼貢獻到另外一個開發(fā)者的倉庫中,或者建立自己的公共倉庫,讓其他開發(fā)者基于自己的工作開始,為自己的倉庫貢獻代碼。于是,Git 的分布式協(xié)作便可以衍生出種種不同的工作流程,我會在接下來的章節(jié)介紹幾種常見的應用方式,并分別討論各自的優(yōu)缺點。你可以選擇其中的一種,或者結合起來,應用到你自己的項目中。

集中式工作流

通常,集中式工作流程使用的都是單點協(xié)作模型。一個存放代碼倉庫的中心服務器,可以接受所有開發(fā)者提交的代碼。所有的開發(fā)者都是普通的節(jié)點,作為中心集線器的消費者,平時的工作就是和中心倉庫同步數(shù)據(jù)(見圖 5-1)。

2015-05-19/555ae1fb314e3

圖 5-1. 集中式工作流

如果兩個開發(fā)者從中心倉庫克隆代碼下來,同時作了一些修訂,那么只有第一個開發(fā)者可以順利地把數(shù)據(jù)推送到共享服務器。第二個開發(fā)者在提交他的修訂之前,必須先下載合并服務器上的數(shù)據(jù),解決沖突之后才能推送數(shù)據(jù)到共享服務器上。在 Git 中這么用也決無問題,這就好比是在用 Subversion(或其他 CVCS)一樣,可以很好地工作。

如果你的團隊不是很大,或者大家都已經(jīng)習慣了使用集中式工作流程,完全可以采用這種簡單的模式。只需要配置好一臺中心服務器,并給每個人推送數(shù)據(jù)的權限,就可以開展工作了。但如果提交代碼時有沖突, Git 根本就不會讓用戶覆蓋他人代碼,它直接駁回第二個人的提交操作。這就等于告訴提交者,你所作的修訂無法通過快進(fast-forward)來合并,你必須先拉取最新數(shù)據(jù)下來,手工解決沖突合并后,才能繼續(xù)推送新的提交。 絕大多數(shù)人都熟悉和了解這種模式的工作方式,所以使用也非常廣泛。

集成管理員工作流

由于 Git 允許使用多個遠程倉庫,開發(fā)者便可以建立自己的公共倉庫,往里面寫數(shù)據(jù)并共享給他人,而同時又可以從別人的倉庫中提取他們的更新過來。這種情形通常都會有個代表著官方發(fā)布的項目倉庫(blessed repository),開發(fā)者們由此倉庫克隆出一個自己的公共倉庫(developer public),然后將自己的提交推送上去,請求官方倉庫的維護者拉取更新合并到主項目。維護者在自己的本地也有個克隆倉庫(integration manager),他可以將你的公共倉庫作為遠程倉庫添加進來,經(jīng)過測試無誤后合并到主干分支,然后再推送到官方倉庫。工作流程看起來就像圖 5-2 所示:

  1. 項目維護者可以推送數(shù)據(jù)到公共倉庫 blessed repository。
  2. 貢獻者克隆此倉庫,修訂或編寫新代碼。
  3. 貢獻者推送數(shù)據(jù)到自己的公共倉庫 developer public。
  4. 貢獻者給維護者發(fā)送郵件,請求拉取自己的最新修訂。
  5. 維護者在自己本地的 integration manger 倉庫中,將貢獻者的倉庫加為遠程倉庫,合并更新并做測試。
  6. 維護者將合并后的更新推送到主倉庫 blessed repository。

2015-05-19/555ae275233b9

圖 5-2. 集成管理員工作流

在 GitHub 網(wǎng)站上使用得最多的就是這種工作流。人們可以復制(fork 亦即克隆)某個項目到自己的列表中,成為自己的公共倉庫。隨后將自己的更新提交到這個倉庫,所有人都可以看到你的每次更新。這么做最主要的優(yōu)點在于,你可以按照自己的節(jié)奏繼續(xù)工作,而不必等待維護者處理你提交的更新;而維護者也可以按照自己的節(jié)奏,任何時候都可以過來處理接納你的貢獻。

司令官與副官工作流

這其實是上一種工作流的變體。一般超大型的項目才會用到這樣的工作方式,像是擁有數(shù)百協(xié)作開發(fā)者的 Linux 內(nèi)核項目就是如此。各個集成管理員分別負責集成項目中的特定部分,所以稱為副官(lieutenant)。而所有這些集成管理員頭上還有一位負責統(tǒng)籌的總集成管理員,稱為司令官(dictator)。司令官維護的倉庫用于提供所有協(xié)作者拉取最新集成的項目代碼。整個流程看起來如圖 5-3 所示:

  1. 一般的開發(fā)者在自己的特性分支上工作,并不定期地根據(jù)主干分支(dictator 上的 master)衍合。
  2. 副官(lieutenant)將普通開發(fā)者的特性分支合并到自己的 master 分支中。
  3. 司令官(dictator)將所有副官的 master 分支并入自己的 master 分支。
  4. 司令官(dictator)將集成后的 master 分支推送到共享倉庫 blessed repository 中,以便所有其他開發(fā)者以此為基礎進行衍合。

2015-05-19/555ae29f2e8ed 圖 5-3. 司令官與副官工作流

這種工作流程并不常用,只有當項目極為龐雜,或者需要多級別管理時,才會體現(xiàn)出優(yōu)勢。利用這種方式,項目總負責人(即司令官)可以把大量分散的集成工作委托給不同的小組負責人分別處理,最后再統(tǒng)籌起來,如此各人的職責清晰明確,也不易出錯(譯注:此乃分而治之)。

以上介紹的是常見的分布式系統(tǒng)可以應用的工作流程,當然不止于 Git。在實際的開發(fā)工作中,你可能會遇到各種為了滿足特定需求而有所變化的工作方式。我想現(xiàn)在你應該已經(jīng)清楚,接下來自己需要用哪種方式開展工作了。下節(jié)我還會再舉些例子,看看各式工作流中的每個角色具體應該如何操作。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號