Git 功能分支工作流

功能分支工作流背后的核心理念是,所有功能开发都应在专用分支而不是 main 分支中进行。这种封装使多个开发人员可以轻松开发特定功能,而不会干扰主代码库。这也意味着 main 分支永远不会包含损坏的代码,这对于持续集成环境来说是一个巨大的优势。

封装功能开发还使得利用拉取请求成为可能,拉取请求是围绕分支发起讨论的一种方式。它们为其他开发人员提供了在某项功能集成到官方项目之前对其进行签字的机会。或者,如果您在某项功能中陷入困境,您可以打开拉取请求,征求同事的建议。关键是,拉取请求可以让您的团队非常轻松地对彼此的工作发表评论。

Git 功能分支工作流是一个可组合的工作流程,可以由其他高级 Git 工作流程利用。我们在 Git 工作流程概述页面上讨论了其他 Git 工作流程。Git 功能分支工作流以分支模型为重点,这意味着它是管理和创建分支的指导框架。其他工作流程更侧重代码存储库。Git 功能分支工作流可以合并到其他工作流程中。传统上来说,GitflowGit 拷贝工作流在分支模型方面使用 Git 功能分支工作流。

工作原理


功能分支工作流假设有一个中央存储库,main 存储库代表官方项目历史记录。开发人员每次开始开发新功能时都会创建一个新分支,而不是直接在本地 main 分支上提交。功能分支应具有描述性名称,例如 animated-menu-items 或 issue-#1061。这个想法是为每个分支设定一个明确、高度集中的目标。Git 对 main 分支和功能分支没有技术上的区别,因此开发人员可以编辑、暂存和提交对功能分支的变更。

此外,功能分支可以(也应该)推送到中央存储库。这使得无需接触任何官方代码即可与其他开发人员共享功能。由于 main 是唯一的“特殊”分支,因此在中央存储库中存储多个功能分支不会造成任何问题。当然,这也是备份每个人本地提交的一种便捷方式。以下是功能分支生命周期的演练。

从主分支开始

所有功能分支都是根据项目的最新代码状态创建的。本指南假设它是在 main 分支中维护和更新的。

git checkout main
git fetch origin 
git reset --hard origin/main

这会将代码存储库切换到 main 分支,提取最新的提交,并重置代码存储库的 main 本地副本以匹配最新版本。

创建新分支

为您正在处理的每个功能或事务使用单独的分支。创建分支后,在本地将其签出,这样您所做的任何变更都将在该分支上生效。

git checkout -b new-feature

这会根据 main 签出一个名为 new-feature 的分支,如果分支尚不存在,-b 标记会告诉 Git 创建该分支。

更新、添加、提交和推送变更

在这个分支上,以常见方式编辑、暂存和提交变更,根据需要使用尽可能多的提交来构建该功能。开发该功能并像每次使用 Git 一样进行提交。准备就绪后,推送提交,更新 Bitbucket 上的功能分支。

git status
git add <some-file>
git commit

将功能分支推送到远程存储库

将功能分支推送到中央存储库是个好主意。这可以作为一种方便的备份,当与其他开发人员合作时,这将使他们能够查看对新分支的提交。

git push -u origin new-feature

此命令将新功能推送到中央存储库(原点),-u 标记将其添加为远程跟踪分支。设置跟踪分支后,无需任何参数即可调用 git push,自动将新功能分支推送到中央存储库。要获得有关新功能分支的反馈,请在 Bitbucket CloudBitbucket Data Center 等存储库管理解决方案中创建拉取请求。从那里,您可以添加审阅者并确保在合并之前一切顺利。

解决反馈

现在,队友评论并批准推送的提交。在本地解决他们的评论,提交建议的更改,然后将其推送到 Bitbucket。您的更新显示在拉取请求中。

合并您的拉取请求

在合并之前,如果其他人对代码存储库进行了更改,则可能需要解决合并冲突。当您的拉取请求获得批准且没有冲突时,您可以将代码添加到 main 分支。从 Bitbucket 中的拉取请求合并。

拉取请求

除了隔离功能开发外,分支还允许通过拉取请求讨论更改。一旦有人完成了一个功能,他们不会立即将该功能合并到 main 功能中。相反,他们将功能分支推送到中央服务器并提交拉取请求,要求将新增功能合并到 main 功能中。这使其他开发人员有机会在变更成为主代码库的一部分之前对其进行审查。

代码审查是拉取请求的主要优势,但实际上它们被设计为一种讨论代码的常用方式。您可以将拉取请求看作是专门针对特定分支的讨论。这意味着它们也可以在开发流程的早期使用。例如,如果开发人员在特定功能方面需要帮助,他们要做的就是提交拉取请求。感兴趣的各方将自动收到通知,他们将能够在相关提交旁边看到问题。

拉取请求被接受后,发布功能的实际行为与集中式工作流程中的发布行为大致相同。首先,您需要确保您的本地 main 与上游 main 同步。然后,您将功能分支合并到 main 中,并将更新的 main 推送回中央存储库。

Bitbucket Cloud 或 Bitbucket Server 等产品存储库管理解决方案可以促进拉取请求。有关示例,请查看 Bitbucket Server 拉取请求文档。

示例

以下是使用功能分支工作流的场景类型示例。场景是团队对新功能拉取请求进行代码审查。这是该模型可用于多种用途的一个示例。

Mary 开始了一个新功能

功能分支工作流:提交变更

在开始开发功能之前,Mary 需要一个独立的分支来开发。她可以使用以下命令请求新分支:

 git checkout -b marys-feature main

这会根据 main 签出一个名为 marys-feature 的分支,如果分支尚不存在,-b 标记会告诉 Git 创建该分支。在这个分支上,Mary 以常见方式编辑、暂存和提交变更,根据需要使用尽可能多的提交来构建她的功能。

git status
git add <some-file>
git commit

Mary 去吃午饭

功能分支工作流:git 推送

Mary 在上午为自己的功能添加了一些提交。在她去吃午饭之前,最好将她的功能分支推送到中央存储库。这可以作为一种方便的备份,但如果 Mary 与其他开发人员合作,这也将使他们能够访问她的初始提交。

git push -u origin marys-feature

此命令将 marys-feature 推送到中央存储库(原点),-u 标记将其添加为远程跟踪分支。设置跟踪分支后,Mary 可以在不使用任何参数的情况下调用 git push 来推送她的功能。

Mary 完成了她的功能

功能分支工作流:Git 推送

Mary 吃完午饭回来后,她的功能就完成了。在将其合并到 main 之前,她需要提交拉取请求,让团队的其他成员知道她已经完成了。但首先,她应该确保中央存储库有她最近的提交:

git push

然后,她在自己的 Git GUI 中提交拉取请求,要求将 marys-feature 合并到 main 中,团队成员将自动收到通知。拉取请求的好处在于,它们在相关的提交旁边显示注释,因此可以很容易地询问有关特定变更集的问题。

Bill 收到了拉取请求

功能分支工作流:查看拉取请求

Bill 收到了拉取请求并看了一下 marys-feature。他决定在将其整合到官方项目之前进行一些变更,然后他和 Mary 通过拉取请求来回进行了一些变更。

Mary 做了变更

功能分支工作流:拉取请求修订

为了进行变更,Mary 使用了与创建功能第一次迭代时完全相同的流程。她编辑、暂存、提交更新,并将更新推送到中央存储库。她所有的活动都显示在拉取请求中,Bill 在此过程中仍然可以发表评论。

如果他愿意,Bill 可以将 marys-feature 拉取到自己的本地存储库中,然后自己操作。他添加的任何提交也会显示在拉取请求中。

Mary 发布了功能

功能分支工作流:合并功能分支

Bill 准备好接受拉取请求后,需要有人将该功能合并到稳定项目中(这可以由 Bill 或 Mary 完成):

git checkout main
git pull
git pull origin marys-feature
git push

此流程通常会导致合并提交。一些开发人员就喜欢这样,因为它就像是将该功能与其他代码库的象征性结合。但是,如果您偏爱线性历史记录,则可以在执行合并之前将该功能重新定位到 main 顶端,从而实现快进合并。

有些 GUI 只需单击“接受”按钮即可运行所有这些命令,从而自动执行拉取请求接受流程。如果您没有,它至少应该能够在功能分支合并到 main 分支时自动关闭拉取请求。

同时,John 也在做同样的事情

当 Mary 和 Bill 正在开发 marys-feature 并在她的拉取请求中讨论这个功能时,John 正在用自己的功能分支做同样的事情。通过将功能隔离到不同的分支中,每个人都可以独立工作,但是在需要与其他开发人员共享变更时仍然很简单。

摘要


在本文档中,我们讨论了 Git 功能分支工作流。此工作流程有助于组织和跟踪以业务域功能集为重点的分支。其他 Git 工作流程,例如 Git 拷贝工作流和 Gitflow 工作流,都以代码存储库为重点,可以利用 Git 功能分支工作流来管理其分支模型。本文档演示了实现 Git 功能分支工作流的高级代码示例和虚构示例。要与功能分支工作流建立的一些关键关联包括:

  • 专注于分支模式
  • 可以被其他面向代码存储库的工作流程利用
  • 通过拉取请求和合并评论促进与团队成员的协作

在功能分支的审查和合并阶段使用 git rebase 将创建一个连贯的 Git 功能合并历史记录。功能分支模型是促进团队环境中协作的好工具。

阅读我们的 Gitflow 工作流综合教程,一键深入了解 Gitflow 工作流。

准备好了解 Git 了吗?

试用本交互式教程。

立即开始