-
附录 A: Git 在其他环境中的应用
- A1.1 图形界面
- A1.2 Git 在 Visual Studio 中的应用
- A1.3 Git 在 Visual Studio Code 中的应用
- A1.4 Git 在 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的应用
- A1.5 Git 在 Sublime Text 中的应用
- A1.6 Git 在 Bash 中的应用
- A1.7 Git 在 Zsh 中的应用
- A1.8 Git 在 PowerShell 中的应用
- A1.9 总结
-
附录 B: 在应用程序中嵌入 Git
-
附录 C: Git 命令
5.1 分布式 Git - 分布式工作流
现在你已经设置了一个远程 Git 仓库作为所有开发人员共享代码的中心点,并且你已经熟悉了本地工作流中的基本 Git 命令,接下来你将学习如何利用 Git 提供的一些分布式工作流。
在本章中,你将了解如何在分布式环境中作为贡献者和整合者使用 Git。也就是说,你将学习如何成功地为项目贡献代码并使其对你和项目维护者尽可能容易,以及如何成功地维护一个有多个开发人员贡献的项目。
分布式工作流
与集中式版本控制系统 (CVCS) 相比,Git 的分布式特性使你能够以更大的灵活性让开发人员协作完成项目。在集中式系统中,每个开发人员都是一个节点,或多或少地与一个中央枢纽进行交互。而在 Git 中,每个开发人员都可能是节点和枢纽,也就是说,每个开发人员都可以向其他仓库贡献代码,并且可以维护一个公共仓库供其他人基于其工作并进行贡献。这为你的项目和/或你的团队提供了广泛的工作流可能性,因此我们将介绍一些利用这种灵活性的常见模式。我们将介绍每种设计方案的优点和可能的缺点;你可以选择一种方案来使用,或者可以将每种方案中的特性进行混合和匹配。
集中式工作流
在集中式系统中,通常只有一种协作模式——集中式工作流。一个中央枢纽或仓库可以接受代码,并且每个人都与其同步他们的工作。许多开发人员是节点——中央枢纽的消费者——并与该集中式位置同步。
这意味着如果两个开发人员从枢纽克隆并且都进行了更改,那么第一个将更改推送到服务器的开发人员可以毫无问题地进行。第二个开发人员必须在将更改推送到服务器之前合并第一个开发人员的工作,以避免覆盖第一个开发人员的更改。这个概念在 Git 中与在 Subversion(或任何 CVCS) 中一样,并且此模型在 Git 中也能很好地工作。
如果你已经在公司或团队中习惯了集中式工作流,那么你就可以轻松地在 Git 中继续使用这种工作流。只需设置一个仓库,并授予团队中每个人推送访问权限;Git 不会让用户相互覆盖。
假设 John 和 Jessica 同时开始工作。John 完成了他的更改并将其推送到服务器。然后 Jessica 尝试推送她的更改,但服务器拒绝了。她被告知她正在尝试推送非快进更改,并且在获取和合并之前无法推送。这种工作流对很多人很有吸引力,因为它是一种许多人熟悉和舒适的模式。
这也不限于小型团队。通过 Git 的分支模型,数百名开发者可以成功地在同一个项目中通过数十个分支同时工作。
集成管理器工作流程
因为 Git 允许您拥有多个远程仓库,所以您可以使用一种工作流程,其中每个开发者对其自己的公共仓库拥有写入权限,并对其他人的仓库拥有读取权限。这种情况通常包括一个代表“官方”项目的规范仓库。要为该项目做出贡献,您需要创建项目的自己的公共克隆并将其更改推送到该克隆。然后,您可以向主项目的维护者发送请求,以拉取您的更改。维护者随后可以将您的仓库添加为远程仓库,在本地测试您的更改,将它们合并到其分支中,并将其推回其仓库。该流程如下所示(请参阅 集成管理器工作流程)。
-
项目维护者将其更改推送到其公共仓库。
-
贡献者克隆该仓库并进行更改。
-
贡献者将其更改推送到他们自己的公共副本。
-
贡献者向维护者发送电子邮件,要求他们拉取更改。
-
维护者将贡献者的仓库添加为远程仓库并在本地进行合并。
-
维护者将合并的更改推送到主仓库。
这是一种非常常见的工作流程,使用像 GitHub 或 GitLab 这样的以中心仓库为基础的工具,在这些工具中,很容易对项目进行分叉并将您的更改推送到分叉中,以便所有人看到。这种方法的主要优点之一是,您可以继续工作,主仓库的维护者可以在任何时候拉取您的更改。贡献者不必等待项目整合他们的更改——每个参与者都可以按照自己的节奏工作。
独裁者和副官工作流程
这是多仓库工作流程的一种变体。它通常被拥有数百名协作者的大型项目使用;一个著名的例子是 Linux 内核。不同的集成管理器负责仓库的某些部分;他们被称为副官。所有副官都有一位集成管理器,被称为仁慈的独裁者。仁慈的独裁者将其目录中的更改推送到一个参考仓库,所有协作者都需要从该仓库拉取更改。该流程如下所示(请参阅 仁慈的独裁者工作流程)。
-
普通开发者在他们的主题分支上工作,并将他们的工作重新定位到
master
之上。master
分支是独裁者推送到的参考仓库的分支。 -
副官将开发者的主题分支合并到他们的
master
分支中。 -
独裁者将副官的
master
分支合并到独裁者的master
分支中。 -
最后,独裁者将其
master
分支推送到参考仓库,以便其他开发者可以在其上重新定位。
这种工作流程并不常见,但在非常大型的项目或高度分层环境中可能有用。它允许项目领导者(独裁者)将大部分工作委托出去,并在整合之前在多个点收集大量的代码子集。
管理源代码分支的模式
注意
|
Martin Fowler 创建了一份名为“管理源代码分支的模式”的指南。本指南涵盖了所有常见 Git 工作流程,并解释了如何/何时使用它们。还包括一个部分比较高整合频率和低整合频率。 |
工作流程总结
这些是一些使用分布式系统(如 Git)可能使用的一些常用工作流程,但您可以看到,可以进行许多变体以适应您特定于现实世界的工作流程。现在您(希望)能够确定哪种工作流程组合可能适合您,我们将介绍一些关于如何完成构成不同流程的主要角色的更具体的示例。在下一节中,您将了解一些有关如何为项目做出贡献的常见模式。