前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何在主干开发模式中使用 Pull Request 做代码评审

如何在主干开发模式中使用 Pull Request 做代码评审

作者头像
DevOps时代
发布于 2018-12-14 02:23:18
发布于 2018-12-14 02:23:18
2.9K0
举报

代码评审(Code Review)是极限编程中用来保障代码质量的有效方式。

而拉式请求(Pull Request)的模式,在 GitHub 网站作为分布式代码协作的一种模式被成功运用之后,也很快成被很多团队引用到 Git Flow 中的流程中。

Git Flow 中由于特性分支的存在,因此在特性分支(feature 分支)往开发分支(develop)合并时,就为使用 Pull Request 提供了时机:当 Pull Request 被通过时,代码才被合并进开发分支。

在主干开发(Trunk Based Development)的模式中,想采用 Pull Request 模式来辅助代码评审的动机是想要有一个简单易用的工具来组织代码评审的内容,记录评审会议期间团队对代码修改的建议,并追踪后续修复过程。

但在主干开发的团队中,由于没有功能分支的存在,所以“技术上”并不满足创建 Pull Request 的前提条件。因此,采用主干开发的团队一直默默使用一些额外的工具和方法来解决上述问题。

由于只是技术上的问题,那么解决起来也就不麻烦了。通过创建临时的分支,在临时分支上创建 Pull Request 即可在主干开发的团队中使用 Pull Request 来做代码评审。

1. Pull Request

下图是 GitHub 网站上关于 Pull Request 的示意图:

在非主干开发的团队中,图中上面的直线即为团队主干(即 GitHub Flow 中的 master 分支,或者 Git Flow 的 develop 分支),代码合并入团队主干之前,开发人员在自己的分支中开发,做了若干次的提交(commit),然后在功能开发完成之后,准备将这些提交合并到团队主干中去。

接下来就打开代码协作网站(比如 GitHub),创建一个 Pull Request(是的,也可以为同一个代码库中的不同分支之间创建 Pull Request),并等待评审通过后,代码就可以被合并到团队主干中去。

在 Pull Request 的页面,评审者、代码作者及其他人员可以就代码的细节展开讨论,提出建议修改的地方,代码作者通过继续向自己的分支提交代码来达到评审者的要求,最终代码被合并到团队主干。

下图(来自 GitHub 文档)是 GitHub 上对 Pull Request 展开讨论的示意图,在该界面可以看到拉式请求的简介,以及提交列表和对文件的修改细节:

作为一种代码提交过程的协作流程,Pull Request 模式与广为使用的 Git Flow 结合的很好,因此在很多代码协作工具中都提供了这样的功能,除了 GitHub,在 TFS、gitlab 或者 gogs 这些同类软件中都提供了类似的功能。

2. 主干开发中的代码评审

不过,ThoughtWorks 更推荐主干开发,并且从持续集成的有效性等方面考虑认为 Git Flow 是有害的。简单来说,主干开发就是所有开发人员直接将代码提交到主干分支上,而不以团队成员或功能等其他方式创建临时或长期分支。

很多人可能担心,那大家在活跃开发之中的时候,代码都往主干上提交,不是相互影响、一片混乱吗?理论上是很有可能的。

而主干开发得到推荐最直接的原因就是,这是最有利于持续集成的一种代码模式。同时,持续集成也是能确保代码不会陷入混乱的有力措施。不过,光有持续集成是不够的。

极端情况下,一个使坏的开发人员可以通过故意不写测试,或者删掉已有单元测试来避免触发持续集成的检查,从而给代码库中增加错误的代码。为了保障代码的质量,团队共同开展的代码评审也是必要的措施。

有了主干开发的加持,团队希望只要持续集成处于成功状态,提交代码应该是越早越好。

我们不希望因为评审过程而失去这种自由,所以评审不应该是阻碍代码进入主干的一种“流程”,而只是对已提交代码的一种确认。

所以,我们几乎从来没有考虑过 Gerrit 这样的流程辅助软件。团队曾一直使用很原始的方式来进行代码评审,所有人围着同一台电脑(或大屏幕),在电脑上使用 Gitk 等代码历史查看工具挨个查看提交中所包含的变更,并就修改细节进行讨论。

这样做的好处是,评审过程非常轻量级,只要用一个变更历史查看工具就可以做评审。但一个个提交去看,也带来一些效率问题。

所以也陆续尝试过一些能把多次提交中的变更的差异合并显示的工具(比如 WebStorm 等 JetBrains 系 IDE 的变更历史查看工具)来提高一些评审的效率。

一开始,大家很享受这种轻量级的代码评审。一个小时下来,整个团队前一天的代码都看完了。期间由一个人拿便签纸记下收到的反馈,再由开发人员各自领取属于自己的条目回去修复。

不过,一段时间以后人们偶然发现,一些此前在代码评审中讨论过的问题,最终还是引发了——比如在 QA 环境发现了相关的缺陷。也就是说,这些在代码评审过程中提出的修订意见并没有得到及时落实。

一个便签条,贴到屏幕上,如果当时快速修复了这些问题,就很高效。但如果当时被其他工作打断而没有及时处理,后面可能就忘记了。我们缺少一个在评审完成后的跟踪和确认机制。

3. 在主干开发中使用 Pull Request

有同学再次提起了 Pull Request,我们此时发现它不光是一种代码协作流程,它实际上也提供了在协作过程中承载信息、跟踪结果的能力。Pull Request 页面中的讨论、注释,以及标记等功能,可以很好地用来记录和跟踪代码评审的内容。待下次评审,再来检查上次评审过的条目,以确认之前讨论过的修订意见都被妥善处理了。

在确认了要使用 Pull Request 模式之后,挡在我们面前的还有两个问题:

  • 主干开发模式中只有一个分支,并没有功能分支,因此没有可用于创建 Pull Request 的条件
  • 即使有分支,如果要等 Pull Request 评审通过才能合并到主干,那么也是不小的延迟,与持续集成的思路不符

对于没有分支可用于创建 Pull Request,这并不麻烦,只需要创建临时分支即可。第二个问题,我们准备创建临时分支、推送到远端之后,创建了 Pull Request 之后就立即将该分支合并到主干。

这时 Pull Request 会自动被关闭,不过这并不影响它记录变更、支持评审活动的功能。既然代码都已经合并到了主干,临时的分支也没有了用途,所以也可以删除了。

如果嫌每次提交代码时都有这么多步骤太繁琐了,可以写一个脚本把整个过程自动化起来。GitHub、TFS 等代码协作平台都提供了命令行工具以及 API,这样的脚本写起来并不麻烦。

有了 Pull Request,结合代码协作平台(比如 GitHub)提供的标记(label)功能,可以进一步优化出一套工作流程出来:

  1. 需要提交代码的同学创建一个 Pull Request,并将其标记为 pending-review(即“待评审”)
  2. 在第二天的评审活动上,找到所有已经标记为 pending-review 的 Pull Request
  3. 在这些 Pull Request 查看修改记录,并讨论形成修订意见
  4. 评审完成后,去掉 Pull Request 上的 pending-review 的标记,同时如果有修订意见形成,则标记为 pending-fix(即“待修复”)
  5. 在第三天的评审活动上,首先快速检查第二天形成的修订意见是否已经修订完毕,再开始当天的评审。确认已修订完毕后,去除 Pull Request 上的 pending-fix 标记

通过这样一番“折腾”,就可以在主干开发模式下利用 Pull Request 来管理代码评审的过程了。整个过程并不需要引入其他的工具,配置起来非常简单;最终的操作流程对原来的主干开发的开发过程的影响很小,接纳它的成本很小。经过一段时间的实践,我们发现这样的轻量级的流程很快受到了团队的欢迎,并得到了较好的坚持。

(全文完)

文章作者 陈计节 上次更新 2018-07-08 许可协议 文章作者保留所有权利,禁止转载。读者可不受限的阅读、分享链接。可在注明来源时引用本文片断,但引用的内容不应超过全文的 1/10 字数。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps时代 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​CODING DevOps 代码质量实战系列第一课:代码规范与 Git Flow
连续创业者、DIY/Linux 玩家、知乎小 V,曾在创新工场、百度担任后端开发。十余年一线研发和带队经验,经历了 ToB、ToC、O2O、国内、出海各种项目,见证了云计算时代的诞生,擅长研发最佳实践:Code Review、DevOps、Git Workflow、敏捷开发、架构、极客办公硬件。
腾讯云 CODING
2020/08/25
4880
​CODING DevOps 代码质量实战系列第一课:代码规范与 Git Flow
【GIT版本控制】--协作流程
Git协作流程中的关键概念包括Fork和Pull Request,它们允许多人在项目中协作并贡献代码。以下是关于Fork和Pull Request的简要总结: 1. Fork:
喵叔
2023/10/08
3470
疫情下更合适的开发模式
问题的提出 任何复杂的软件都是团队工作的产物,所以我们会利用版本控制工具和不同的分支策略来协助团队的日常开发和交流,mainline开发模式和pull request开发模式(以下简称PR)则是最常用到的两种模式。在开发时选择哪种模式也成了一个经常被讨论的话题。 在疫情时代,远距离办公可能会阻碍团队的交流,PR开发模式也变得越来越流行。一方面PR开发模式可以为代码开发带来更好的隔离性,但另一方面,PR开发模式其实是一种更难掌握或者说要求更高的开发模式。比如:审查和合并 PR 的速度至少取决于三个因素:上下文
ThoughtWorks
2022/06/16
5440
疫情下更合适的开发模式
我们是怎么做Code Review的
前几天看了《Code Review 程序员的寄望与哀伤》,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享、探讨。 我们为什么要推行Code Review呢?我们当时面临着代码混乱、Bug频出的状况。 当时我觉得要有所改变,希望能提高产品的代码质量,改善开发团队面临的困境。并且我个人在开发上有很多经验,也希望这些知识能够在团队内传播。 各种考虑后,我们最后认为推行Code Review能改善或解决我们面临的很多问题。 这篇文章的目的不是告诉大家怎么在一个团
李海彬
2018/03/23
1.8K0
【DevOps实践】企业应用场景众多,怎样选择合适的代码分支模型?
常见的Git类代码分支模型有Git flow、Github flow、Gitlab flow、TBD等,企业可根据其业务、团队、管控等多方因素,选用其中一种或多种代码分支模型,随着DevOps工具的引入,在不降低代码质量管控力度的同时可有效提升代码管控效率,代码分支模型的应用可更加灵活自主。
嘉为蓝鲸
2020/11/13
9310
深入解析 Git 分支策略:如何为团队选择最优开发工作流程
在现代软件开发中,特别是多人协作的开发环境中,选择适合的 Git 分支策略对项目的成功至关重要。不同的团队规模、项目复杂度和发布频率都可能需要不同的分支策略。常见的 Git 分支策略包括 Git Flow、GitHub Flow 和 Trunk Based Development (主干开发)。本文将深入分析这些分支策略的优缺点,并探讨如何根据团队规模和项目需求选择合适的工作流程。同时,我们将提供相应的代码示例和最佳实践,帮助团队避免常见的协作问题。
一键难忘
2024/09/07
2310
腾讯 AICR : 智能化代码评审技术探索与应用实践(上)
本文将详细阐述 腾讯云 AI 代码助手团队和 CR 团队在智能化代码评审领域的技术探索与应用实践。
腾讯云代码助手
2024/11/20
5660
腾讯 AICR : 智能化代码评审技术探索与应用实践(上)
Pull Request 的最佳实践与高效审查指南
Pull Request(PR)是多人协作项目中常用的代码审查方式,确保代码在集成到主分支之前被仔细审查。然而,PR 处理不当,可能导致审查效率低下、代码质量不佳或集成延迟。本文将结合实际案例,深入探讨 Pull Request 的最佳实践,介绍标准流程、代码审查技巧,以及如何在大型项目中高效维护 PR 质量。
Swift社区
2024/09/13
2350
Pull Request 的最佳实践与高效审查指南
版本分支管理标准 - Trunk Based Development 主干开发模型
之前分享过《版本分支管理标准 - Git Flow》,不过在实际使用过程中, 因为其有一定的复杂度,使用起来较为繁琐,所以一些人员较少的团队并不会使用这个方案。
用户1172223
2019/09/12
6.2K0
版本分支管理标准 - Trunk Based Development 主干开发模型
Git 分支管理策略汇总
最近,团队新入职了一些小伙伴,在开发过程中,他们问我 Git 分支是如何管理的,以及应该怎么提交代码?
AlwaysBeta
2022/11/11
1.2K0
Git 分支管理策略汇总
Google 和腾讯为什么都采用主干开发模式?
本文介绍了两种常用的代码分支模式:特性分支开发模式、主干开发模式,分别阐述了其优缺点和适用环境;同时剖析了 Google 和腾讯采用主干开发模式的背景和决策因素,捎带分享了这 2 个巨头的实践,供读者在技术选型中参考。
深度学习与Python
2021/06/08
3.1K0
Google 和腾讯为什么都采用主干开发模式?
持续交付之如何选型代码分支策略?
高效的持续交付体系,必定需要一个合适的代码分支策略。采用不同的代码分支策略,意味着实施不同的代码集成与发布流程,这会影响整个研发团队每日的协作方式,因此研发团队通常需要很认真地选择自己的策略。
高楼Zee
2021/03/16
2K0
Git分支开发模式学习
本文目标 了解不同的分支开发模式并给出自己的理解 为熟练掌握并选择不同的分支开发模式做准备 参考资料 segmentationfault official-分支开发工作流 按照官方的分类就比较简单: 长期分支:分支将长期存在,不同分支之间的区别将是稳定性的区别。其中master最稳定,dev比较不稳定,topic次之。 短期分支:除了master外不存在长期分支,所有分支都将短期存在,目标为实现一种主题(单一的特性或工作)。实现完成之后就合并到master中 阿里的分支模式分类就更接近生产,除了强调开发外
千灵域
2022/06/17
6120
Git分支开发模式学习
化繁为简的企业级Git管理实战(三):分支管理策略
作者: 潘伟洲(HaHack) 说到版本控制,就不得不提到分支管理策略。就像学开车必须学学交通规则。分支管理策略是代码版本控制的基础组成部分。为团队定制一套合适的分支管理策略,就好比制定了一套合理的交通规则,可以让团队的代码的更加有序地演进,尽可能降低多分支带来的复杂度,并避免由于分支混乱引发的各种“车祸”。本文将简单讨论下我们在开发过程中尝试的各种分支管理策略,在面对各种复杂场景下呈现的优势与不足,以及我们的妥协和后续期望。 Github-Flow 作为 Github 的重度用户,我首先考虑的当然是 Gi
HaHack
2018/07/03
1.2K0
高效团队的gitlab flow最佳实践
当前git是大部分开发团队的首选版本管理工具,一个好的流程规范可以让大家有效地合作,像流水线一样有条不紊地进行团队协作。
JadePeng
2021/02/04
4.2K0
高效团队的gitlab flow最佳实践
Git的分支工作流与Pull Request
  上一篇文章介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增、提交进行管理,可以查看提交历史、代码差异等功能。但实际上git有一个重量级的功能“分支”,git的分支与其它工具的分支不同,git分支的操作完全在本地进行,所以可以快速的创建和切换。
星哥玩云
2022/07/24
7770
Git的分支工作流与Pull Request
团队如何选择合适的Git分支策略?
现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等。
DevOps在路上
2023/04/26
7880
团队如何选择合适的Git分支策略?
一杯茶的时间,上手 Git 团队协作开发
本文总结了图雀团队协作开发的流程与规范,仅供参考。最优的解决方案还是需要结合团队的实际情况,具体问题具体分析。
一只图雀
2020/05/07
1.1K0
DevOps 代码质量实战:代码规范与 Git Flow
查看完整直播回放:https://cloud.tencent.com/edu/learning/live-2837
可可爱爱没有脑袋
2020/10/16
1.4K0
GitLab的代码评审工具你用对了吗?
从代码提交的时机来看,一般会有两种模式,即开源MR/PR模式和commit模式。而这这种划分默认是在代码提交的环节进行代码评审。因此从代码提交与代码评审的关系来看,也可以有所谓的代码提交时触发的代码评审和与代码提交无关的代码评审。而从代码评审的地点来看,一般也会有两种模式,即WEB模式和IDE模式。
Antony
2021/10/26
9.4K0
推荐阅读
相关推荐
​CODING DevOps 代码质量实战系列第一课:代码规范与 Git Flow
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文