-
1. 起步
-
2. Git 基础
-
3. Git 分支
-
4. 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上部署 Git
- 4.3 生成 SSH 公钥
- 4.4 架设服务器
- 4.5 Git Daemon
- 4.6 Smart 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 中,每个开发人员都可能既是节点又是枢纽;也就是说,每个开发人员都可以向其他仓库贡献代码,也可以维护一个公共仓库,供他人基于其工作并为其贡献代码。这为您的项目和/或您的团队提供了广泛的工作流可能性,因此我们将介绍几种利用这种灵活性的常见模式。我们将逐一介绍每种设计的优点和潜在缺点;您可以选择一种来使用,也可以混合搭配其中的功能。
集中式工作流
在集中式系统中,通常只有一种协作模式——集中式工作流。一个中心枢纽,或称仓库,可以接受代码,每个人都将其工作与之同步。许多开发人员是节点——该枢纽的消费者——并与该集中位置同步。
这意味着,如果两个开发人员从枢纽克隆并都进行了更改,第一个将更改推回的人可以毫无问题地完成。第二个开发人员在推送更改之前必须合并第一个开发人员的工作,以免覆盖第一个开发人员的更改。这个概念在 Git 中与在 Subversion(或任何 CVCS)中一样真实,而且这种模式在 Git 中也能完美运行。
如果您已经习惯了公司或团队中的集中式工作流,那么您可以使用 Git 轻松地继续使用该工作流。只需设置一个仓库,并给予团队中的每个人推送权限;Git 不会让用户覆盖彼此。
假设 John 和 Jessica 同时开始工作。John 完成了他的更改并将其推送到服务器。然后 Jessica 尝试推送她的更改,但服务器拒绝了。她被告知她正在尝试推送非快进式更改,并且在获取和合并之前无法这样做。这种工作流对许多人来说很有吸引力,因为这是许多人熟悉和习惯的模式。
这也不仅限于小型团队。借助 Git 的分支模型,数百名开发人员可以同时在数十个分支上成功地处理单个项目。
集成经理工作流
由于 Git 允许您拥有多个远程仓库,因此可以采用一种工作流,其中每个开发人员都对其自己的公共仓库拥有写访问权限,并对其余所有人的仓库拥有读访问权限。这种情况通常包括一个代表“官方”项目的规范仓库。要为此项目做出贡献,您可以创建项目自己的公共克隆,并将您的更改推送到其中。然后,您可以向主项目维护者发送请求,要求他们拉取您的更改。维护者随后可以将您的仓库添加为远程仓库,在本地测试您的更改,将其合并到他们的分支中,然后推回到他们的仓库。该过程如下(请参阅 集成经理工作流)
-
项目维护者将其推送到其公共仓库。
-
贡献者克隆该仓库并进行更改。
-
贡献者将其推送到自己的公共副本。
-
贡献者向维护者发送电子邮件,请求其拉取更改。
-
维护者将贡献者的仓库添加为远程仓库并在本地合并。
-
维护者将其合并的更改推送到主仓库。
这是像 GitHub 或 GitLab 这样的基于 Hub 的工具中非常常见的工作流,在那里可以轻松地 Fork 一个项目并将您的更改推送到您的 Fork 中供大家查看。这种方法的主要优点之一是您可以继续工作,而主仓库的维护者可以随时拉取您的更改。贡献者不必等待项目合并他们的更改——双方都可以按照自己的节奏工作。
独裁者与副手工作流
这是多仓库工作流的一个变体。它通常由拥有数百名协作者的庞大项目使用;一个著名的例子是 Linux 内核。各种集成经理负责仓库的特定部分;他们被称为副手。所有副手都有一个被称为仁慈的独裁者的集成经理。仁慈的独裁者从其目录推送到一个参考仓库,所有协作者都需要从中拉取。该过程如下(请参阅 仁慈的独裁者工作流)
-
普通开发人员在其主题分支上工作,并根据
master分支进行 rebase。master分支是独裁者推送到的参考仓库。 -
副手将开发人员的主题分支合并到他们的
master分支。 -
独裁者将其
master分支与副手的master分支合并。 -
最后,独裁者将该
master分支推送到参考仓库,以便其他开发人员可以对其进行 rebase。
这种工作流并不常见,但在非常大的项目或高度分层的环境中可能很有用。它允许项目负责人(独裁者)委派大量工作,并在多个点收集大块代码,然后再将其集成。
管理源代码分支的模式
|
注意
|
Martin Fowler 制作了一份名为“管理源代码分支的模式”的指南。本指南涵盖了所有常见的 Git 工作流,并解释了如何/何时使用它们。还有一个部分比较了高集成频率和低集成频率。 |
工作流总结
这些是像 Git 这样的分布式系统可能支持的一些常用工作流,但您可以看到,可能存在许多变体来适应您特定的实际工作流。现在您(希望)可以确定哪种工作流组合可能适合您,我们将介绍一些更具体的示例,说明如何完成构成不同流程的主要角色。在下一节中,您将学习一些贡献项目的常见模式。