Copilot 应用新增堆叠会话功能,支持在一个会话中处理多个 PR,直接提升代码审查和修改效率。
请先花一点时间看看 GitHub Copilot app 的这张截图。它很小,里面有很多图标,却讲述了一个无比精彩、令我兴奋不已的故事。
这张图展示的是一组 stacked sessions。它们是同一代码仓库中的一系列任务,每个 session 都建立在前一个 session 的基础之上!
稍后我会详细介绍,不过首先,这张截图为什么如此神奇?这得从十多年前说起。我有一个非常古老的个人应用代码仓库。大约在 2014 年年底,我第一次开发了它。这么多年来,它一直能够完成我想做的事情——它有点像一个个人“生活”仪表盘,整合了日历、家中的智能设备和任务管理。我偶尔也会更新它,但这些更新变得越来越难处理。
项目的依赖已经过时了。过时到令人尴尬。我还在使用 React 15(发布于 2016 年)、用于 CSS 预处理的 Less,以及大约同一时期的 react-bootstrap 版本。没错,你没有看错。Bootstrap。这套技术真的太老了。
在 AI 出现之前,要理清这团彻底失控的乱麻,可能得花上我好几个星期。我以前尝试过,但最后放弃了。它并不是世界上规模最大的应用,但又刚——刚——好大到足以让升级过程变得非常痛苦,而付出与回报实在不成比例。
……但现在我们有 AI 了。于是我启动 GitHub Copilot app,添加这个代码仓库,然后开始动手。
我确实试了!下面是我在 Plan mode 中使用的 prompt:
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 review,并进行了相当多轮的来回沟通,才做出各项决定。等结果达到我的预期后,我点击“go”,让 app 在项目里大展身手,看看它究竟能不能成功!
……结果没有成功,而且是我的错。
还记得我说过自己“以前尝试过,但最后放弃了”吗?事实证明,我其实还有一个旧的 devbranch,并且已经在那里对部分代码进行了现代化改造,只是没有意识到接下来会遇到兼容性问题。
不过,这反而是一件好事!
运行这个 session 生成的新版本后,我才意识到,自己的分支是从 main 创建的,但我日常使用的当前部署版本,实际上来自 dev 上那个经过部分更新的版本。因此,我之前为自己开发的一些必要功能,也必须包含在这批变更中。不过,这些改动的规模又刚好大到让我不得不把新变更应用到 devbranch 上,这样才能稍微保住自己的理智,而不是把 devchanges 拉进 main。
在 AI 出现之前……天啊,这种情况肯定会让我沮丧到抓狂。老实说,当时的我同样很懊恼。我花费了不少时间和 token,试图按照一个自认为还不错的计划让项目运行起来。但是!我只用一个简单的请求,就成功切换了方向——也切换了 sessions。效果比我预想中酷得多:
之前的工作并没有全部浪费!Copilot 为我创建了一个新 session,关闭了之前尝试创建的 pull request,并把我确定的样式方案移植到了它正在对 dev branch 应用的变更中。
呼,好吧,现在我终于有了一个进展顺利的 branch,以及一个自己还算满意的 pull request。然而开始测试后,我忍不住注意到 console 中出现了一些古老的 warning。
当我看到代码里还在引用 findDOMNode 和 componentWillReceiveProps 时,心中顿时充满了恐惧。这些 function 我自己已经很多很多年没碰过了。唉。
这些引用现在大多已经不在我的 codebase 中了,但仍然存在于 react-bootstrap 里。我再次打开 Plan mode,因为我需要弄清楚:升级能不能解决问题,还是应该彻底移除这个 library:
Do you think we should remove react-bootstrap entirely (and replace with a modern alternative), or just upgrade/migrate existing components?
运行后,我得到了一个不错的计划。它分析了各种可选方案,并建议彻底替换这个 library。
我需要确保自己的变更不会受到现有工作的影响,但对于当前正在做的事情来说,替换 react-bootstrap 感觉会造成相当严重的 scope creep。
我发现,在很多“agentic”工程工作中,尤其难以避免这种 scope creep。因为不需要亲自编写所有代码,所以人们很容易受到诱惑,创建一个包含 10,000 行变更的 pull request,一次性把所有想做的事情全部完成!说到底,这其实只是一种新形式的拖延,哈哈。
因此,我没有创建一个需要自己测试的超大型 pull request,而是通过一个新 session 将它拆开,并输入了下面的 prompt:
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 app:
这也太酷了。Stacked sessions 加上 stacked pull requests?这就是未来吗?
如果你无法从名称理解它的含义:stack 是同一代码仓库中的一系列 pull requests,其中每个 pull request 都以它下方那个 pull request 的 branch 为目标,从而形成一条有序的链,最终合入 main branch。
对我来说,不仅各个 sessions 前后衔接,它们的变更也是如此!
我知道,自己表现得如此兴奋,多少有点夸张,但我的快乐绝对是真诚的。荒废这个旧 codebase 多年以后,能够如此轻松地交付这些变更,实在是一段令人愉悦的经历。
让我们再看看开头的那张截图:我来带你逐层了解它。
最上方是我导入的 repo。
接下来的“Frontend modernization”是初始 session 的名称。
再往里嵌套的一层,是第一次尝试创建的 pull request,最终没有交付(所以显示的是红色图标)。
同一层级中接下来嵌套的部分,是我们为 devbranch 创建并成功运行的 pull request。
它下面嵌套的 session,是仍在进行中的 draft pull request,其中包含 react-bootstrap 的相关变更。
软件开发从来都不是一帆风顺的。但借助这些现代工具,这个项目变得容易了许多。
如果你也想对自己的 codebase 进行现代化改造,不妨试试这种方式!
在 GitHub 上所有提交代码的地方体验 pull request stacks,并在 GitHub Copilot app 中体验 stacked sessions >
Cassidy 是 GitHub 的开发者布道高级总监。她喜欢开发软件、为创业公司提供建议,以及教开发者如何构建更好的产品。她每周都会发布 newsletter,你可以在其中获取她的最新动态、练习编程题,还能在收件箱里收到一个笑话!
一套实用的 GitHub Copilot workflow,帮助你完成软件原型设计、规划、实现和审查,而不必追逐每一个新出现的 AI 工具。
刚接触 GitHub Copilot app?了解如何启动项目、与 AI agents 协作、探索 canvases,并简化你的开发 workflow。
Copilot 现在会按照公开列出的 API 费率对使用量计费。比较直接访问 model,与其周围的编程 workflow、policy 和 harness 工作之间的差异。