章節 ▾ 第二版

5.1 Git 分散式 - 分散式工作流

現在您已經設定了一個遠端 Git 倉庫,作為所有開發人員共享程式碼的中心焦點,並且您已經熟悉了本地工作流中的基本 Git 命令,接下來我們將探討如何利用 Git 提供的某些分散式工作流。

在本章中,您將瞭解如何在分散式環境中作為貢獻者和整合者使用 Git。也就是說,您將學習如何成功地為專案貢獻程式碼,並儘可能簡化您和專案維護者的工作,以及如何成功地維護一個有眾多開發人員貢獻的專案。

分散式工作流

與集中式版本控制系統(CVCS)相比,Git 的分散式特性允許您在開發人員如何協作專案方面擁有更大的靈活性。在集中式系統中,每個開發人員都是一個節點,或多或少地與中心樞紐平等地工作。然而,在 Git 中,每個開發人員都可能既是節點又是樞紐;也就是說,每個開發人員都可以向其他倉庫貢獻程式碼,也可以維護一個公共倉庫,供他人基於其工作併為其貢獻程式碼。這為您的專案和/或您的團隊提供了廣泛的工作流可能性,因此我們將介紹幾種利用這種靈活性的常見模式。我們將逐一介紹每種設計的優點和潛在缺點;您可以選擇一種來使用,也可以混合搭配其中的功能。

集中式工作流

在集中式系統中,通常只有一種協作模式——集中式工作流。一箇中心樞紐,或稱倉庫,可以接受程式碼,每個人都將其工作與之同步。許多開發人員是節點——該樞紐的消費者——並與該集中位置同步。

Centralized workflow
圖 53. 集中式工作流

這意味著,如果兩個開發人員從樞紐克隆並都進行了更改,第一個將更改推回的人可以毫無問題地完成。第二個開發人員在推送更改之前必須合併第一個開發人員的工作,以免覆蓋第一個開發人員的更改。這個概念在 Git 中與在 Subversion(或任何 CVCS)中一樣真實,而且這種模式在 Git 中也能完美執行。

如果您已經習慣了公司或團隊中的集中式工作流,那麼您可以使用 Git 輕鬆地繼續使用該工作流。只需設定一個倉庫,並給予團隊中的每個人推送許可權;Git 不會讓使用者覆蓋彼此。

假設 John 和 Jessica 同時開始工作。John 完成了他的更改並將其推送到伺服器。然後 Jessica 嘗試推送她的更改,但伺服器拒絕了。她被告知她正在嘗試推送非快進式更改,並且在獲取和合並之前無法這樣做。這種工作流對許多人來說很有吸引力,因為這是許多人熟悉和習慣的模式。

這也不僅限於小型團隊。藉助 Git 的分支模型,數百名開發人員可以同時在數十個分支上成功地處理單個專案。

整合經理工作流

由於 Git 允許您擁有多個遠端倉庫,因此可以採用一種工作流,其中每個開發人員都對其自己的公共倉庫擁有寫訪問許可權,並對其餘所有人的倉庫擁有讀訪問許可權。這種情況通常包括一個代表“官方”專案的規範倉庫。要為此專案做出貢獻,您可以建立專案自己的公共克隆,並將您的更改推送到其中。然後,您可以向主專案維護者傳送請求,要求他們拉取您的更改。維護者隨後可以將您的倉庫新增為遠端倉庫,在本地測試您的更改,將其合併到他們的分支中,然後推回到他們的倉庫。該過程如下(請參閱 整合經理工作流

  1. 專案維護者將其推送到其公共倉庫。

  2. 貢獻者克隆該倉庫並進行更改。

  3. 貢獻者將其推送到自己的公共副本。

  4. 貢獻者向維護者傳送電子郵件,請求其拉取更改。

  5. 維護者將貢獻者的倉庫新增為遠端倉庫並在本地合併。

  6. 維護者將其合併的更改推送到主倉庫。

Integration-manager workflow
圖 54. 整合經理工作流

這是像 GitHub 或 GitLab 這樣的基於 Hub 的工具中非常常見的工作流,在那裡可以輕鬆地 Fork 一個專案並將您的更改推送到您的 Fork 中供大家檢視。這種方法的主要優點之一是您可以繼續工作,而主倉庫的維護者可以隨時拉取您的更改。貢獻者不必等待專案合併他們的更改——雙方都可以按照自己的節奏工作。

獨裁者與副手工作流

這是多倉庫工作流的一個變體。它通常由擁有數百名協作者的龐大專案使用;一個著名的例子是 Linux 核心。各種整合經理負責倉庫的特定部分;他們被稱為副手。所有副手都有一個被稱為仁慈的獨裁者的整合經理。仁慈的獨裁者從其目錄推送到一個參考倉庫,所有協作者都需要從中拉取。該過程如下(請參閱 仁慈的獨裁者工作流

  1. 普通開發人員在其主題分支上工作,並根據 master 分支進行 rebase。master 分支是獨裁者推送到的參考倉庫。

  2. 副手將開發人員的主題分支合併到他們的 master 分支。

  3. 獨裁者將其 master 分支與副手的 master 分支合併。

  4. 最後,獨裁者將該 master 分支推送到參考倉庫,以便其他開發人員可以對其進行 rebase。

Benevolent dictator workflow
圖 55. 仁慈的獨裁者工作流

這種工作流並不常見,但在非常大的專案或高度分層的環境中可能很有用。它允許專案負責人(獨裁者)委派大量工作,並在多個點收集大塊程式碼,然後再將其整合。

管理原始碼分支的模式

注意

Martin Fowler 製作了一份名為“管理原始碼分支的模式”的指南。本指南涵蓋了所有常見的 Git 工作流,並解釋瞭如何/何時使用它們。還有一個部分比較了高整合頻率和低整合頻率。

工作流總結

這些是像 Git 這樣的分散式系統可能支援的一些常用工作流,但您可以看到,可能存在許多變體來適應您特定的實際工作流。現在您(希望)可以確定哪種工作流組合可能適合您,我們將介紹一些更具體的示例,說明如何完成構成不同流程的主要角色。在下一節中,您將學習一些貢獻專案的常見模式。