GitHub Copilot 应用新增堆叠会话与拉取请求功能
Stacked sessions and pull requests in the GitHub Copilot app
GitHub Copilot 应用推出堆叠会话功能,允许用户在同一个仓库中创建一系列相互承接的任务,每个会话可基于前一个会话的成果继续工作。作者通过一个十余年历史的个人项目演示了该功能:先使用 Plan 模式制定前端现代化计划,再通过堆叠会话将 React-Bootstrap 替换工作拆分为独立会话,并自动为每个会话创建对应的拉取请求,避免范围蔓延。
GitHub Copilot 的堆叠会话让多步骤 PR 拆分成链,Cassidy 用十年老项目演示如何避免巨型改动,对 Copilot 用户是可直接套用的实操指南。
我想让你花点时间看看这张来自 GitHub Copilot 应用 的截图。它很小,图标很多,却讲述了一个最辉煌的故事,让我非常兴奋。

这张图展示了一组堆叠的会话。它们是同一仓库中的一系列任务,每个会话都在前一个的基础上构建!
关于这些的更多内容见下文,但首先,为什么这张截图如此神奇?我们需要回到十多年前才能讲清楚。我有一个非常古老的仓库,用于一个个人应用。我最初创建它是在 很久以前(大约 2014 年底),这些年来它一直做着我想要它做的事(它就像我家中日历和智能设备以及任务管理的个人“生活”仪表盘)。我偶尔会做一些更新,但这些更新变得越来越难以应付。
我的依赖项变得 老旧了。老得令人尴尬。我当时用的是 React 15(发布于 2016 年)、用于 CSS 预处理的 Less,以及大约那个时期的 react-bootstrap 版本。是的,你没看错。Bootstrap。这太老了。
在 AI 出现之前,试图理清这团彻头彻尾的乱麻会花掉我好几周时间。我以前试过,也放弃过。它并不是世界上最大的应用,但它 恰恰好大到足够令人痛苦,而付出的努力根本不值得。
……但我们现在 确实有了 AI,所以我启动了 GitHub Copilot 应用,添加了这个仓库,然后就开始动手了。
第一步:我能一次搞定吗?
不能。
不过我还是试了!这是我在 Plan 模式下使用的提示词:
I want to modernize the frontend for this project. I first wrote a lot of this code more than 10 years ago and it should be cleaned up a lot. I'm thinking we start either using Tailwind or just vanilla CSS (please vet everything to help me decide), we remove all Less (etc), and clean everything up accessibility-wise and responsiveness-wise. Right now I really want to just focus on styles, and then slowly but surely organize and consolidate the React functionality. It might be worth modernizing dependencies, too. Let's come up with a plan around this before diving in.
1. Nothing is sacred, it's okay if we have to completely start over some parts
2. Links should change colors and add underlines on hover/focus
3. Input boxes should have a smaller border radius in general, and their labels should be cleaner
4. There should be good wrapping and a max-width on containers so that an input box doesn't span an entire wide monitor.我把它输入 Claude Opus 4.8,又让 GPT-5.5 做了一次 Rubber Duck 评审,来回反复了好一阵才把决策定下来。等我改到自己满意的程度后,我按下“开始”,让应用在我的项目上大干一场,看看它能不能跑通!
……结果没跑通,而且是我的锅。
第二步:意识到我以前就试过这件事
还记得我说过“以前试过然后放弃了”吗?结果发现,我其实有一个旧的 dev 分支,在那个分支上我确实已经现代化改造了一部分,只是当时没意识到自己会撞上那些兼容性问题。
不过,这是件好事!
当我运行这次会话产生的新版本时,我意识到我是从 main 分出来的,但我平时经常使用的当前部署,用的却是我在 dev 上那个部分更新过的版本。所以,我自己做的一些想要的功能需要被纳入这一组改动中。但这些改动恰好大到让我不得不把这些改动应用到 dev 分支上,好让自己省点心,而不是把 dev 的改动拉到 main 上。
在 AI 出现之前……天哪,这准会让我抓狂到薅头发。说实话,我在这里也挺抓狂的。我花了时间和 token,试图用一个我自认为还不错的方案把它跑起来。但是!我只用一句简单的请求就切换了思路(以及会话),这比我预想的要酷得多:

一切都没白费!Copilot 为我新建了一个会话,关闭了我之前尝试的那个 pull request,并把我做出的样式决策移植到了它正应用到 dev 分支的改动中。
第三步:测试后的发现
呼,好吧,我有了一个不错的分支,还有一个我相当满意的 pull request。然而,当我开始测试时,我忍不住注意到控制台里有一些旧的警告。
当我看到对 findDOMNode 和 componentWillReceiveProps 的旧引用时,我的心充满了恐惧,这些函数我个人已经很多很多年没碰过了。唉。
这些引用在我的代码库里已经不太多了,但它们存在于 react-bootstrap 中。我再次打开了 Plan 模式,因为我需要弄清楚升级是否可行,还是应该彻底移除这个库:
Do you think we should remove react-bootstrap entirely (and replace with a modern alternative), or just upgrade/migrate existing components?运行这个给了我一个不错的方案,讨论了各种选项,并建议彻底替换掉这个库。
第四步:在一个会话之上叠加另一个会话
我需要确保我的改动不会影响现有工作,但替换 react-bootstrap 这件事,对于我当前正在做的事情来说,感觉像是很大的范围蔓延。
我发现在我的很多“智能体式”工程工作中,特别难以避免那种范围蔓延。因为我不必自己写所有代码,所以特别容易忍不住提交 10,000 行的 pull request,把所有我想做的事情一次性搞定!而这其实只是一种新形式的拖延,哈哈。
所以,与其给自己做一个巨型 pull request 来测试,我把它拆开,开了一个新会话,并提示:
Let's make a pull request for the existing work, and then start a new session for this react-bootstrap replacement work that will branch off this existing work here, and be a separate pull request to merge into dev after this one. 这就是让我觉得神奇到想写这篇博客文章的部分。GitHub Copilot 应用:
- 为我当前所有改动创建了一个 pull request
dev - 为移除 react-bootstrap 创建了一个“堆叠会话”(它继承了之前的上下文,创建了一个在现有会话之后运行的会话,制定了计划,让我批准了计划,然后运行了)
- 在我的现有工作之后创建了一个堆叠 pull request
这太酷了。堆叠会话和堆叠 pull request?这就是未来吗?
是的。
如果你光看名字还不明白这是什么意思:一个堆叠(stack)就是同一仓库中的一系列 pull request,其中每个 pull request 都以下面那个 pull request 的分支为目标,形成一条有序的链条,最终落到你的主分支上。
在我的情况里,不仅这些会话一个接一个,它们的改动也是一个接一个!
第五步:带着堆叠的 pull request 驶向夕阳
我知道我这份兴奋有点厚脸皮,但我的快乐是真诚的。在冷落了我的旧代码库那么久之后,能如此轻松地交付这些改动,真是一次愉快的体验。
让我们再看一眼第一张截图:我来带你过一遍。

- 在最上方,你可以看到我拉取进来的那个仓库。
- 接下来是“Frontend modernization”,这是初始会话的名称。
- 再往里嵌套的那一层,是第一次尝试的 pull request,我们最终没有交付它(所以是红色的图标)。
- 再下一层嵌套在同一层级的,是我们为
dev分支拿到一个可用的 pull request 的地方。 - 在那下面嵌套的会话,是正在进行中的草稿 pull request,带有 react-bootstrap 的改动。
软件开发从来都不是一帆风顺的。但有了这些现代工具,这个项目变得轻松了许多。
如果你想让自己代码库也实现现代化,不妨试一试!
在 GitHub 上任何提交代码的地方查看 pull request 堆叠,以及在 GitHub Copilot 应用 >中使用堆叠会话
来源:GitHub Blog · github.blog