创建新拷贝工作流
分叉工作流程与其他流行的 Git 工作流程有根本的不同。克隆为每个开发人员提供了他们自己的服务器端存储库,而不用将单一服务器端存储库用作“集中式”代码库。这意味着每个贡献者不只有一个而是两个 Git 存储库;即,一个私有的本地存储库和一个公开的服务器端存储库。分叉工作流程最常出现在公共开源项目中。
分叉工作流程的主要优势是可以整合贡献,无需所有人推送到单一的中央存储库。开发人员推送到自己的服务器端存储库,只有项目维护人员才能推送到官方存储库。这允许维护人员接受任何开发人员的提交,而无需授予他们对官方代码库的写入权限。
分叉工作流程通常遵循基于 Gitflow 工作流程的分支模型。这意味着完整的功能分支将用于合并到原始项目维护人员的存储库中。结果是分布式工作流程为大型自然团队(包括不可信的第三方)提供了一种灵活的方式来进行安全协作。这也使其成为开源项目的理想工作流程。
工作原理
与其他 Git 工作流程一样,分叉工作流程从存储在服务器上的官方公共存储库开始。但是,当新开发人员想要开始开发该项目时,他们不会直接克隆官方存储库。
取而代之的是,他们分叉官方存储库以在服务器上创建其副本。这个新副本用作他们的个人公共存储库——不允许其他开发人员推送,但他们可以从中提取变更(我们稍后会明白为什么这很重要)。在他们创建了服务器端副本后,开发人员执行 git clone
以将其副本保存到他们的本地计算机上。就像在其他工作流程中一样,这充当他们的私有开发环境。
当他们准备好发布本地提交时,他们会将提交推送到自己的公共存储库,而不是官方存储库。然后,他们向主存储库提交拉取请求,让项目维护人员知道更新已准备好集成。如果提供的代码有问题,拉取请求也可以作为便捷的讨论话题。以下是此工作流程的分步示例。
- 开发人员“分叉”一个“官方”服务器端存储库。这将创建他们自己的服务器端副本。
- 新的服务器端副本克隆到他们的本地系统。
- “官方”存储库的 Git 远程路径已添加到本地克隆中。
- 已创建一个新的局部功能分支。
- 开发人员在新分支上进行变更。
- 已为变更创建新提交。
- 分支被推送到开发人员自己的服务器端副本。
- 开发人员打开了从新分支到“官方”存储库的拉取请求。
- 拉取请求获得合并批准并合并到原始服务器端存储库中
为了将该功能集成到官方代码库中,维护人员将贡献者的变更提取到他们的本地存储库中,检查以确保它不会破坏项目,将其合并到他们的本地 main
分支中,然后将 main
分支推送到服务器上的官方存储库。贡献现在是项目的一部分,其他开发人员应该从官方存储库中拉取来同步他们的本地存储库。
重要的是要理解分叉工作流程中“官方”存储库的概念只是一个惯例。实际上,使官方存储库如此正式的唯一原因是它是项目维护人员的公共存储库。
分叉与克隆
需要注意的是,“已分叉”存储库和“分叉中”不是特殊操作。已分叉存储库是使用标准的 git clone
命令创建的。分叉存储库通常是“服务器端克隆”,通常由第三方 Git 服务(如 Bitbucket)管理和托管。没有唯一的 Git 命令来创建分叉存储库。克隆操作本质上是存储库及其历史记录的副本。
在分叉工作流程中创建分支
所有这些个人公共存储库实际上只是与其他开发人员共享分支的一种便捷方式。每个人都应该使用分支来隔离单个功能,就像在功能分支工作流程和 Gitflow 工作流程中一样。唯一的区别是如何共享这些分支。在分叉工作流程中,它们被拉到另一个开发人员的本地存储库中,而在功能分支和 Gitflow 工作流程中,它们被推送到官方存储库。
克隆存储库
分叉工作流程项目的所有新开发人员都需要分叉官方存储库。如前所述,分叉只是标准的 git clone
操作。可以通过 SSH’ing 进入服务器并运行 git clone
将其复制到服务器上的另一个位置来做到这一点。像 Bitbucket 这样的热门 Git 托管服务提供可自动执行此步骤的代码存储库分叉功能。
克隆您的分叉
接下来,每个开发人员都需要克隆自己的公共分叉存储库。他们可以使用熟悉的 git clone
命令来完成此操作。
假设使用 Bitbucket 来托管这些存储库,则项目的开发人员应该拥有自己的 Bitbucket 帐户,他们应该使用以下方法克隆存储库的分叉副本:
git clone https://user@bitbucket.org/user/repo.git
添加远程存储库
而其他 Git 工作流程使用指向中央存储库的单一原始远程存储库,而分叉工作流程需要两个远程存储库——一个用于官方存储库,一个用于开发人员的个人服务器端存储库。虽然您可以随心所欲地调用这些远程存储库,但常见的惯例是使用 origin 作为分叉存储库的远程存储库(这将在您运行 git clone
时自动创建),使用上游作为官方存储库的上游。
git remote add upstream https://bitbucket.org/maintainer/repo
您需要使用上面的命令自己创建上游远程存储库。随着官方项目的进展,您可以轻松地使本地存储库保持最新状态。请注意,如果您的上游存储库启用了授权(即它不是开源的),则需要提供用户名,如下所示:
git remote add upstream https://user@bitbucket.org/maintainer/repo.git
这要求用户在克隆或从官方代码库中拉取之前提供有效的密码。
在分支中工作:展开变更并推送
在开发人员的分叉存储库的本地副本中,他们可以像在其他 Git 工作流程中一样编辑代码、提交变更和创建分支:
git checkout -b some-feature # Edit some code git commit -a -m "Add first draft of some feature"
在他们将其推送到公共存储库之前,他们的所有变更都将完全保密。而且,如果官方项目已经向前推进,他们可以使用 git pull
访问新的提交:
git pull upstream main
由于开发人员应该在专用功能分支中工作,因此这通常会导致快速合并。
创建拉取请求
开发人员准备好分享他们的新功能后,他们需要做两件事。首先,他们必须通过将其推送到他们的公共存储库来使其他开发人员可以访问他们的贡献。他们的原始远程存储库应该已经设置好了,所以他们所要做的就是以下几点:
git push origin feature-branch
这与其他工作流程的不同之处在于,原始远程存储库指向开发人员的个人服务器端存储库,而不是主代码库。
其次,他们需要通知项目维护人员他们想将其功能合并到官方代码库中。Bitbucket 提供了一个“拉取请求”按钮,该按钮会显示一个表单,要求您指定要合并到官方存储库中的分支。通常,您需要将您的 feature
分支集成到上游远程存储库的 main
分支中。
摘要
总而言之,分叉工作流程通常用于公共开源项目。分叉是在项目代码存储库的服务器副本上执行的 git clone
操作。分叉工作流程通常与 Bitbucket 等 Git 托管服务一起使用。分叉工作流程的高级示例是:
- 您想为托管在 bitbucket.org/userA/open-project 的开源库做出贡献
- 使用 Bitbucket 创建代码存储库的分叉到 bitbucket.org/YourName/open-project
- 在本地系统上,您可以在 https://bitbucket.org/YourName/open-project 上执行
git clone
来获取代码存储库的本地副本 - 您在本地代码存储库中创建了一个新的
feature
分支 - 完成新功能的工作已完成,并执行
git commit
以保存变更 - 然后,您将新
feature
分支推送到您的远程分叉代码存储库 - 使用 Bitbucket,您可以在 bitbucket.org/userA/open-project 上针对原始代码存储库打开新分支的拉取请求
分叉工作流程可帮助项目的维护人员向任何开发人员的贡献开放存储库,而不必手动管理每个贡献者的授权设置。这为维护人员提供了更多的“拉取”式工作流。分叉工作流程最常用于开源项目,也可以应用于私有企业工作流程,以便对合并到版本中的内容进行更权威的控制。这对于拥有部署经理或严格发布周期的团队可能很有用。
不确定哪种工作流程适合您?查看我们全面的 Git 工作流程比较页面。