-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協定
- 4.2 在伺服器上取得 Git
- 4.3 產生您的 SSH 公開金鑰
- 4.4 設定伺服器
- 4.5 Git Daemon
- 4.6 智慧型 HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管選項
- 4.10 總結
-
5. 分散式 Git
-
A1. 附錄 A:其他環境中的 Git
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 總結
-
A2. 附錄 B:將 Git 嵌入您的應用程式
-
A3. 附錄 C:Git 指令
5.1 分散式 Git - 分散式工作流程
現在您已經設定了遠端 Git 儲存庫作為所有開發人員分享程式碼的中心點,並且熟悉了本機工作流程中的基本 Git 指令,接下來您將了解如何運用 Git 提供的一些分散式工作流程。
在本章中,您將看到如何在分散式環境中以貢獻者和整合者的身份使用 Git。也就是說,您將學習如何成功地為專案貢獻程式碼,並盡可能讓您和專案維護者都方便,以及如何成功地維護一個由許多開發人員貢獻的專案。
分散式工作流程
與集中式版本控制系統 (CVCS) 相比,Git 的分散式特性讓您在開發人員如何協作處理專案方面更具彈性。在集中式系統中,每個開發人員都是一個節點,或多或少與中心樞紐平等地工作。然而,在 Git 中,每個開發人員都可能既是節點又是樞紐;也就是說,每個開發人員都可以為其他儲存庫貢獻程式碼,並維護一個公共儲存庫,其他人可以在此基礎上進行工作並為其貢獻。這為您的專案和/或您的團隊提供了廣泛的工作流程可能性,因此我們將介紹一些利用這種彈性的常見範例。我們將探討每種設計的優點和可能的缺點;您可以選擇使用單一設計,也可以混合搭配每種設計的功能。
集中式工作流程
在集中式系統中,通常有一個單一的協作模型,即集中式工作流程。一個中心樞紐或儲存庫可以接受程式碼,並且每個人都與其同步他們的工作。許多開發人員是節點,即該樞紐的使用者,並與該集中位置同步。

這表示如果兩位開發者從 Hub 複製專案並都進行了變更,第一位將變更推回的開發者可以順利完成。第二位開發者必須先合併第一位開發者的工作,才能推送變更,以避免覆蓋第一位開發者的變更。這個概念在 Git 中與在 Subversion (或任何 CVCS) 中一樣成立,並且這個模型在 Git 中運作良好。
如果您的公司或團隊已經習慣集中式工作流程,您可以輕鬆地繼續在 Git 中使用該工作流程。只需設定一個單一的儲存庫,並給予您團隊中的每個人推送權限即可;Git 不會讓使用者互相覆蓋彼此的變更。
假設 John 和 Jessica 同時開始工作。John 完成了他的變更並將其推送到伺服器。然後 Jessica 嘗試推送她的變更,但伺服器拒絕了。她被告知她嘗試推送非快速轉送變更,並且必須先提取 (fetch) 和合併 (merge) 才能推送。這種工作流程對很多人來說很有吸引力,因為它是一種許多人熟悉且習慣的範例。
這也不僅限於小型團隊。藉由 Git 的分支模型,數百位開發者可以同時透過數十個分支成功地在單一專案上工作。
整合管理者工作流程
由於 Git 允許您擁有複數個遠端儲存庫,因此可以採用一種工作流程,讓每位開發者都擁有對自己公開儲存庫的寫入權限,以及對其他所有人儲存庫的讀取權限。這種情境通常包含一個代表「官方」專案的標準儲存庫。為了對該專案做出貢獻,您可以建立自己公開的專案複本,並將您的變更推送到其中。然後,您可以向主專案的維護者發送請求,要求他們拉取您的變更。維護者可以將您的儲存庫添加為遠端,在本機測試您的變更,將它們合併到他們的分支中,然後推回他們的儲存庫。這個流程如下 (請參閱 整合管理者工作流程):
-
專案維護者將內容推送到他們的公開儲存庫。
-
貢獻者複製該儲存庫並進行變更。
-
貢獻者將內容推送到他們自己的公開副本。
-
貢獻者向維護者發送電子郵件,請求他們拉取變更。
-
維護者將貢獻者的儲存庫添加為遠端,並在本機進行合併。
-
維護者將合併後的變更推送到主儲存庫。

這是在 GitHub 或 GitLab 等基於 Hub 的工具中非常常見的工作流程,在這些工具中,您可以輕鬆地 Fork 一個專案,並將您的變更推送到您的 Fork 中,以便所有人都能看到。這種方法的主要優勢之一是您可以繼續工作,並且主儲存庫的維護者可以隨時拉取您的變更。貢獻者不必等待專案納入他們的變更,每個參與者都可以按照自己的步調工作。
獨裁者和副官工作流程
這是多儲存庫工作流程的一種變體。它通常由擁有數百位協作者的大型專案使用;一個著名的例子是 Linux 核心。各種整合管理者負責儲存庫的某些部分;他們被稱為 *副官*。所有副官都有一位稱為仁慈獨裁者的整合管理者。仁慈獨裁者從他們的目錄推送到一個參考儲存庫,所有協作者都需要從該儲存庫拉取內容。這個流程如下 (請參閱 仁慈獨裁者工作流程):
-
一般開發人員在他們的主題分支上工作,並將他們的工作 Rebase 到
master
的頂部。master
分支是獨裁者推送到的參考儲存庫的分支。 -
副官將開發人員的主題分支合併到他們的
master
分支中。 -
獨裁者將副官的
master
分支合併到獨裁者的master
分支中。 -
最後,獨裁者將該
master
分支推送到參考儲存庫,以便其他開發人員可以基於它 Rebase。

這種工作流程並不常見,但對於非常大的專案或高度階層化的環境可能很有用。它允許專案領導者 (獨裁者) 委派大部分工作,並在整合之前於多個點收集大量的程式碼子集。
管理原始碼分支的模式
注意
|
Martin Fowler 撰寫了一份指南「管理原始碼分支的模式」。本指南涵蓋了所有常見的 Git 工作流程,並說明如何/何時使用它們。還有一個章節比較了高和低整合頻率。 |
工作流程總結
這些是使用像 Git 這樣的分散式系統可能用到的一些常用工作流程,但您可以看到可以進行許多變化,以適應您特定的現實世界工作流程。既然您 (希望) 可以確定哪個工作流程組合可能適合您,我們將介紹一些更具體的範例,說明如何完成構成不同流程的主要角色。在下一節中,您將了解一些為專案做出貢獻的常見模式。