打开网易新闻 查看精彩图片

GitHub近日发布了堆叠PR(Stacked PRs)功能,该功能目前处于私有预览阶段,旨在帮助开发者更轻松地管理大型拉取请求,并加快整个代码审查流程。

堆叠PR允许一个拉取请求基于前一个拉取请求构建,从而形成一条"堆叠链"。链中的每个拉取请求都可以独立进行审查和合并,但前提是其下方的所有拉取请求均已完成合并。此外,用户也可以选择将整个堆叠一次性合并。

堆叠PR的核心优势在于鼓励开发者提交更小粒度的拉取请求,从而降低审查难度。官方文档指出:"堆叠中的每个分支应代表一个独立的、符合逻辑的工作单元,可以被单独审查。"

然而在实际开发中,这一目标往往难以实现。开发者通常希望在等待前序代码合并期间持续推进工作,而不愿因等待审查而中断进度。为此,他们往往会在独立分支上持续开发直至功能完整,最终提交一个涉及大量文件变更的巨型拉取请求,给审查工作带来极大负担。

堆叠PR功能虽然对GitHub而言是全新能力,但在其他代码管理与审查系统中早有类似实践,通常被称为"堆叠差异(Stacked Diffs)"。其中最具代表性的是由Facebook的Evan Priestley和Luke Shepard于2007年开发的Differential工具。Priestley曾表示:"我花了大量时间等待代码审查,这正是我构建这个工具的主要动力。"Differential后来成为Facebook内部工具套件Phabricator的核心组件,并于2011年以开源形式对外发布。开源版Phabricator已于2021年停止更新,但其分支项目Phorge目前仍在积极维护中。

在使用堆叠PR时,开发者的工作流程与传统方式存在显著差异。堆叠最底层的PR通常直接基于主分支创建,而非独立分支。曾在Facebook担任工程师的Jackson Gabbard(2006年至2016年)在一篇详细说明文章中写道:"使用过Phabricator堆叠差异工作流的开发者普遍非常喜爱这种方式,并且在去到新的地方后也会主动寻找类似的工具。"

在Hacker News上,社区对这一功能的讨论总体持积极态度。不过也有开发者指出:"我不太明白为什么需要这个命令行工具(CLI),Git本身近几年的更新已经可以原生支持这种工作流。"此处提及的CLI正是GitHub专属扩展工具gh stack。尽管如此,将该功能整合进GitHub仍是一项重大改进,而CLI的存在也大幅简化了使用门槛。负责该功能开发的GitHub工程师Sameen Karim表示:"CLI完全是可选的,你完全可以通过图形界面创建堆叠PR。"

在AI层面,GitHub同样有所布局。Karim在LinkedIn上表示:"瓶颈已不再是写代码,而是审查代码。堆叠PR有助于解决这一问题。"他还透露,堆叠CLI同样面向AI智能体使用场景进行了专项设计。

Q&A

Q1:堆叠PR(Stacked PRs)是什么?它解决了什么问题?

A:堆叠PR是GitHub新推出的功能,允许多个拉取请求以堆叠形式相互依赖,每个PR可独立审查和合并。它主要解决了开发者在等待代码审查时无法持续推进工作的问题,避免了因功能未拆分而提交庞大、难以审查的拉取请求的情况,从而提升代码审查效率。

Q2:堆叠PR和Phabricator的堆叠差异功能有什么关系?

A:堆叠PR的概念源于Phabricator的"堆叠差异(Stacked Diffs)"工作流。Phabricator是Facebook于2011年开源的内部工具套件,其核心组件Differential由Evan Priestley和Luke Shepard于2007年开发,专门用于解决代码审查效率问题。许多熟悉这一工作流的开发者对其评价极高,GitHub此次将类似功能整合进平台,是对这一成熟工作流的传承与发展。

Q3:使用堆叠PR必须用命令行工具(CLI)吗?

A:不是必须的。GitHub提供了专属CLI扩展工具gh stack来辅助管理堆叠PR,但负责该功能开发的工程师Sameen Karim明确表示,CLI完全是可选项,用户可以直接通过GitHub的图形界面来创建和管理堆叠PR,无需使用命令行工具。