创建拉取请求
Pull requests are a feature that makes it easier for developers to collaborate using Bitbucket. They provide a user-friendly web interface for discussing proposed changes before integrating them into the official project.
简单而言,拉取请求是一种通知机制,让开发人员通知团队成员自己已完成某项功能。当开发人员的功能分支准备就绪后,可以通过自己的 Bitbucket 帐户提出拉取请求。这样,所有相关人员都会知道需要审查代码并合并到 main
分支中。
但是,拉取请求不仅仅是一个通知,它还是讨论拟议功能的专门论坛。如果更改有任何问题,队友可以在拉取请求中发布反馈,甚至通过推送后续提交来调整功能。所有这些活动都直接在拉取请求中进行跟踪。
与其他协作模式相比,这种用于共享提交的正式解决方案使工作流程更加简化。SVN 和 Git 都可以使用简单的脚本自动发送通知电子邮件,但是,在讨论变更时,开发人员通常必须依靠电子邮件线程。这可能会变得很随意,尤其是在涉及后续提交的情况下。拉取请求将所有这些功能放到您的 Bitbucket 存储库旁边的友好网页界面中。
拉取请求剖析
当您提出拉取请求时,要做的就是请求其他开发人员(例如项目维护人员)将分支从您的代码库拉入他们的代码库。这意味着在提出拉取请求时,您需要提供 4 种信息:源代码库、源分支、目标代码库和目标分支。
Bitbucket 会将其中许多值设置为合理的默认值。但是,根据您的协作工作流程,您的团队可能需要指定不同的值。上图显示了一个请求将功能分支合并到官方主分支的拉取请求,但是还有许多其他使用拉取请求的方法。
工作原理
拉取请求可以与功能分支工作流、Git 流工作流或创建新拷贝工作流一起使用。但是,拉取请求需要两个不同的分支或两个不同的代码库,因此无法与集中式工作流一起使用。这些工作流对拉取请求的使用略有不同,但一般过程如下:
1. 开发人员在本地代码存储库的专用分支中创建该功能。
2. The developer pushes the branch to a public Bitbucket repository.
3. The developer files a pull request via Bitbucket.
4. The rest of the team reviews the code, discusses it, and alters it.
5. The project maintainer merges the feature into the official repository and closes the pull request.
本节的其余部分介绍如何利用拉取请求来处理不同的协作工作流程。
相关资料
高级 Git 日志
查看解决方案
了解 Bitbucket Cloud 的 Git
包含拉取请求的功能分支工作流
功能分支工作流使用共享的 Bitbucket 代码库来管理协作,开发人员在隔离的分支中创建功能。但是,开发人员不是立即将它们合并到 main
中,而应该打开一个拉取请求,围绕该功能展开讨论,然后再集成到主代码库中。
功能分支工作流程中只有一个公共代码库,因此拉取请求的目标存储库和源存储库总是一致的。通常情况下,开发人员将其功能分支指定为源分支,将 main
分支指定为目标分支。
收到拉取请求后,项目维护者必须决定该如何做。如果功能准备就绪,他们只需将其合并到 main
中并关闭拉取请求。但是,如果建议的变更有问题,他们可以在拉取请求中发布反馈。后续的提交将显示在相关评论旁边。
也可以为不完整的功能提交拉取请求。例如,如果开发人员在实现特定要求时遇到问题,他们可以提交包含其正在进行的工作的拉取请求。然后,其他开发人员可以在拉取请求中提供建议,甚至通过额外的提交来自己修复问题。
包含拉取请求的 Gitflow 工作流
Gitflow 工作流程与功能分支工作流程类似,但定义了围绕项目发布设计的严格分支模型。在 Gitflow 工作流中添加拉取请求可以让开发人员在处理发布分支或维护分支时方便地讨论发布分支或维护分支。
Gitflow 工作流中的拉取请求机制与上一节完全相同:开发人员只需在需要审核功能、版本或热修复分支时提交拉取请求,团队的其他成员将通过 Bitbucket 收到通知。
功能一般合并到 develop
分支中,而发布和热修复分支则合并到 develop
和 main
中。可以使用拉取请求来正式管理所有这些合并。
使用拉取请求拷贝工作流程
在创建新拷贝工作流中,开发人员将已完成的功能推送到自己的公有代码库而不是共享代码库。之后,他们提出拉取请求,让项目维护者知道可以进行审查了。
拉取请求的通知方面在此工作流程中特别有用,因为项目维护者无法知道其他开发人员何时向其 Bitbucket 存储库添加了提交。
由于每个开发人员都有自己的公共代码库,拉取请求的源代码库将不同于目标代码库。源代码库是开发人员的公共代码库,而源分支是包含建议的变更的源分支。如果开发人员尝试将该功能合并到主代码库中,那么目标存储库是正式项目,目标分支是 main
。
拉取请求还可用来与正式项目之外的其他开发人员协作。例如,如果开发人员正与队友合作处理功能,那么他们可以提出拉取请求,使用队友的 Bitbucket 代码库而不是正式项目作为目标。然后,他们可以将同一功能分支用于源分支和目标分支。
两位开发人员可以在拉取请求中讨论和开发该功能。完成后,他们中的一个人会提交另一个拉取请求,要求将该功能合并到官方主分支中。这种灵活性使得拉取请求在拷贝工作流程中成为非常强大的协作工具。
示例
以下示例演示了如何在拷贝工作流程中使用拉取请求。它同样适用于在小型团队中工作的开发人员和为开源项目做出贡献的第三方开发人员。
在示例中,Mary 是开发人员,John 是项目维护者。它们都有自己的公共 Bitbucket 存储库,而 John 的存储库包含官方项目。
Mary 拷贝了官方项目
要开始在项目中工作,Mary 首先需要对 John 的 Bitbucket 代码库执行拷贝 (fork) 操作。她可以登录 Bitbucket,导航到 John 的代码库,然后单击 Fork 按钮来执行这一操作。
填写拷贝存储库的名称和描述后,她将获得该项目的服务器端副本。
Mary 克隆了她的 Bitbucket 存储库
接下来,Mary 需要克隆她刚刚拷贝的 Bitbucket 存储库。这将在她的本地计算机上为她提供项目的工作副本。她可以通过运行以下命令来完成此操作:
git clone https://user@bitbucket.org/user/repo.git
请注意,git clone
会自动创建一个指回 Mary 拷贝的代码库的 origin
远程代码库。
Mary 开发了一个新功能
在开始编写任何代码之前,Mary 需要为该功能创建一个新的分支。她将使用这个分支作为拉取请求的源分支。
git checkout -b some-feature
# Edit some code
git commit -a -m "Add first draft of some feature"
Mary 可以使用尽可能多的所需提交来创建该功能。而且,如果该功能的历史记录比她想的更混乱,她可以使用交互式变基来删除或压缩不必要的提交。对于较大的项目,清理功能的历史记录可让项目维护人员更轻松地查看拉取请求中发生的情况。
Mary 将该功能推送到她的 Bitbucket 存储库中
在她的功能完成后,Mary 使用简单的 git push
将功能分支推送到自己的 Bitbucket 代码库(而不是正式代码库)中:
git push origin some-branch
这使她的更改可供项目维护者(或任何可能需要访问权限的合作者)使用。
Mary 创建了拉取请求
Bitbucket 有她的功能分支后,Mary 就可以通过 Bitbucket 账户创建拉取请求,方法是导航到已拷贝的代码库,然后单击右上角的 Pull request 按钮。生成的表单会自动将 Mary 的代码库设置为源代码库,并要求她指定源分支、目标代码库和目标分支。
Mary 想将她的功能合并到主代码库中,所以源分支是她的功能分支,目标代码库是 John 的公共代码库,目标分支是 main
。她还需要提供拉取请求的标题和描述。如果除 John 之外还需要其他人批准代码,那么她可以在审批者字段中输入这些人。
在她创建拉取请求后,将通过 John 的 Bitbucket 源和电子邮件(可选)向 John 发送通知。
John 审批了拉取请求
John 可以通过点击他自己的 Bitbucket 代码库中的 Pull request 选项卡来访问大家提出的所有拉取请求。点击 Mary 的拉取请求将向他显示拉取请求的描述、功能的提交历史记录以及它包含的所有变更的不同之处。
如果他认为可以将该功能合并到项目中,那么他需要做的就是点击 Merge 按钮来批准拉取请求,并将 Mary 的功能合并到他的 main
分支中。
但是,在这个例子中,假设 John 在 Mary 的代码中发现了一个小错误,需要她在合并之前修复。他可以对整个拉取请求发表评论,也可以选择该功能历史记录中的特定提交进行评论。
Mary 添加了后续提交
如果 Mary 对反馈有任何疑问,她可以在拉取请求中回复,将其视为其功能的讨论论坛。
为了更正错误,Mary 向她的功能分支添加了另一个提交,并将其推送到她的 Bitbucket 存储库,就像她第一次做的那样。此提交会自动添加到原始的拉取请求中,John 可以在其原始评论旁边再次查看更改。
John 接受了拉取请求
最后,John 接受这些变更,将功能分支合并到主分支中,并关闭拉取请求。该功能现在被集成到项目中,任何处理该功能的其他开发人员都可以使用标准的 git pull
命令将其拉入自己的本地代码库中。
分享此文章
下一主题
推荐阅读
将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。