章节 ▾ 第二版

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 的工具中非常常见的工作流,在这些工具中,很容易分叉一个项目并将你的更改推送到你的分叉中供所有人查看。这种方法的主要优点之一是你可以继续工作,而主仓库的维护者可以随时拉取你的更改。贡献者不必等待项目整合他们的更改——各方都可以按照自己的节奏工作。

独裁者和副官工作流

这是多仓库工作流的一种变体。它通常用于拥有数百名协作者的大型项目;一个著名的例子是 Linux 内核。各种集成管理员负责仓库的某些部分;他们被称为_副官_。所有副官都有一个集成管理员,被称为仁慈的独裁者。仁慈的独裁者从他们的目录推送到一个参考仓库,所有协作者都需要从中拉取。该过程如下(参见仁慈的独裁者工作流

  1. 普通开发者在他们的主题分支上工作,并将他们的工作变基到 master 分支之上。master 分支是独裁者推送到的参考仓库的分支。

  2. 副官将开发者的主题分支合并到他们的 master 分支中。

  3. 独裁者将副官的 master 分支合并到独裁者的 master 分支中。

  4. 最后,独裁者将该 master 分支推送到参考仓库,以便其他开发者可以在其上变基。

Benevolent dictator workflow
图 55. 仁慈的独裁者工作流

这种工作流并不常见,但对于非常大的项目或高度层级化的环境可能很有用。它允许项目负责人(独裁者)委派大部分工作,并在整合之前在多个点收集大量的代码子集。

管理源代码分支的模式

注意

Martin Fowler 编写了一份指南“管理源代码分支的模式”。该指南涵盖了所有常见的 Git 工作流,并解释了如何/何时使用它们。还有一个部分比较了高集成频率和低集成频率。

工作流总结

这些是使用像 Git 这样的分布式系统可能实现的一些常用工作流,但你可以看到许多变体可以适应你特定的实际工作流。现在你(希望)能够确定哪种工作流组合可能适合你,我们将介绍一些更具体的示例,说明如何完成构成不同流程的主要角色。在下一节中,你将学习一些向项目贡献的常见模式。