章節 ▾ 第二版

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 這樣基於樞紐的工具時非常常見的工作流,在這種工具中,你可以輕鬆地派生一個專案,並將你的更改推送到你的派生中供所有人檢視。這種方法的主要優點之一是你可以繼續工作,並且主倉庫的維護者可以隨時拉取你的更改。貢獻者不必等待專案合併他們的更改——各方都可以按照自己的節奏工作。

獨裁者與副官工作流

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

  1. 普通開發者在自己的主題分支上工作,並將工作變基到 master 分支之上。master 分支是獨裁者推送到的參考倉庫的分支。

  2. 副官將開發者的主題分支合併到他們的 master 分支中。

  3. 獨裁者將副官的 master 分支合併到獨裁者的 master 分支中。

  4. 最後,獨裁者將該 master 分支推送到參考倉庫,以便其他開發者可以在其之上進行變基。

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

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

原始碼分支管理模式

注意

Martin Fowler 撰寫了一份指南《原始碼分支管理模式》。該指南涵蓋了所有常見的 Git 工作流,並解釋瞭如何/何時使用它們。其中還有一個章節比較了高低整合頻率。

工作流總結

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

scroll-to-top