ChatGPT、Codex实战:代码改完了为什么PR还是容易断?从Diff、Branch到PR Recovery的6步闭环
很多人使用Codex做工程任务时,会有一个很自然的判断:
代码已经改完了,任务应该也差不多结束了。
但真正进入Git和PR工作流以后,经常会发现:
代码改完,只完成了一半。
因为真实的软件工程链路并不是:
修改代码
↓
Done
而更接近:
修改代码
↓
Review Diff
↓
确认Branch
↓
Commit
↓
Create PR
↓
CI / Review
↓
继续修复
↓
最终Merge
Codex App现在本身就提供Git Diff、Commit、Push、创建Pull Request等Git能力;Diff面板可以直接查看Local Project或Worktree中的修改,并支持针对具体代码继续Review。Codex也可以在GitHub Pull Request基础上继续处理Review反馈。
所以真正容易出问题的不是:
Agent会不会修改代码?
而是:
修改以后,代码状态、Git状态和PR状态能不能一直保持同步。
可以把这条链抽象成:
Code State
↓
Git State
↓
PR State
↓
CI State
↓
Review State
↓
Task State
其中任何一层断掉,
都会出现一种非常常见的情况:
“代码明明改好了,但PR就是不顺。”
一、第一步:Code Done之前,先把Diff看明白
Codex修改完代码以后,第一反应不应该是:
直接Commit。
而应该先看:
Diff。
Codex官方最佳实践就明确建议,在任务完成以后直接使用Diff面板Review修改,重点检查Bug、Regression和风险模式。Diff面板还可以切换查看本轮修改,帮助缩小Review范围。
为什么这一层这么重要?
因为Agent完成任务时很容易同时产生两类修改:
Expected Change
以及:
Incidental Change
例如任务只是:
修复登录接口401。
但Diff里可能同时出现:
auth.ts
session.ts
README.md
package-lock.json
debug.log
其中真正需要的可能只有:
auth.ts
session.ts
其他文件可能来自:
依赖变化;
自动格式化;
临时调试;
顺手修改。
如果不先Review Diff,
后面Commit和PR会把这些变化全部带进去。
二、为什么Diff是Agent工程里的第一个“事实来源”?
Thread里Agent可能说:
我修改了认证逻辑并补充了测试。
但真正进入Git以后,
最可信的不是这句话。
而是:
git diff
因为:
Conversation描述的是Agent认为自己做了什么。
Diff描述的是Repository实际上发生了什么。
两者必须一致。
所以可以建立一个简单原则:
Agent Summary
↓
Diff Verification
↓
Accept Change
而不是:
Agent Summary
↓
直接Commit
这和前面我们讲过的Evidence思维完全一样:
先看实际证据,再相信“Done”。
三、第二步:确认Branch,不要让正确代码落在错误位置
Diff没问题以后,
下一步是:
Branch。
这一步看起来很基础,
但在Codex多Thread、Worktree、多Agent环境里反而更加重要。
例如:
main
正在由开发者自己使用。
Agent运行在:
feat/auth-fix
另一个Agent可能在:
feat/payment
Worktree能够让这些任务拥有独立的工作目录和Git状态,从而避免多个Agent直接干扰同一个Working Tree。
但Worktree解决的是:
Working State Isolation。
它不代表:
Branch一定选对了。
所以提交前至少确认:
Current Branch
Base Branch
Current Revision
尤其是长任务。
因为任务运行期间:
main
可能已经继续向前。
四、一个常见坑:代码正确,但Base已经变了
假设Agent从:
main@A
开始工作。
花了40分钟修改。
期间团队已经合并:
Commit B
Commit C
现在:
main@C
但Agent的Branch仍然基于:
A
这时候Agent自己的测试可能全部通过。
但真正准备PR时:
A
↓
Agent Changes
需要和:
C
重新组合。
于是可能出现:
冲突;
旧代码覆盖;
测试环境变化;
接口Contract已经改变。
所以:
Local Tests Passed
并不一定等于:
PR Ready
Branch和Base必须重新检查。
五、第三步:Commit不是保存动作,而是任务边界
很多人把Commit理解成:
保存一次代码。
但在Agent工作流里,Commit还有另一个很重要的价值:
Traceability。
一个好的Commit应该回答:
这一组修改到底完成了什么?
例如:
不建议:
fix
或者:
update files
更合理的是:
fix(auth): refresh session before token expiry
这样后面PR Review时,
Reviewer能够快速理解:
Goal
↓
Commit
↓
Diff
之间的对应关系。
尤其当Codex继续根据Review修改时,
如果Commit边界本身已经很乱,
后面的PR也会越来越难维护。
六、为什么一个PR不要顺便塞太多东西?
Agent写代码速度越来越快以后,
非常容易出现:
Task A
+
顺手重构B
+
格式调整C
+
依赖升级D
最后全部进入同一个PR。
对于Agent来说:
这些修改可能都“合理”。
但对于Reviewer来说:
真正需要解决的问题变成:
哪些变化属于原始任务?
所以PR真正需要控制的是:
Change Surface。
可以建立一个简单规则:
One Goal
↓
Focused Diff
↓
Reviewable PR
而不是:
One Agent Session
↓
One Huge PR
这两件事不是一回事。
七、第四步:Create PR之后,Task还远远没结束
Codex现在可以把可Review的Diff继续转成Pull Request;OpenAI对Codex的定位也一直包含“完成Pull Request、Refactor、Code Review”等端到端工程任务,而不只是生成代码。
但PR创建成功只是:
PR Open
不是:
Task Done
PR后面还会出现:
CI
Review
Requested Changes
New Commits
Rebase
Conflict
所以真正的状态应该拆开:
Code Done
PR Created
PR Verified
PR Approved
Task Done
很多Agent工作流出问题,
就是把这几个状态全部压成了一个:
Done。
八、第五步:CI失败以后,真正容易把PR越修越乱
这是Codex接PR工作流以后非常常见的场景。
比如:
Agent创建PR。
CI出现:
Unit Test Failed
然后让Codex继续:
修一下。
Codex修改以后:
CI第二次失败:
Type Check Failed
再修改。
第三次:
Lint Failed
如果每次Agent都扩大修改范围,
PR就会从:
Fix Bug
逐渐变成:
Fix Bug
+
Test Change
+
Type Refactor
+
Lint Cleanup
+
Unrelated Files
最终PR越来越难Review。
九、CI失败后正确动作不是“继续改”,而是先分类
出现CI Failure以后,
建议先判断失败属于哪一类。
第一类:Task-related Failure
例如:
你修改的接口导致测试失败。
应该:
Fix
↓
Re-run
第二类:Environment Failure
例如:
网络;
依赖下载;
Runner异常。
应该:
Retry / Environment Check
而不是改代码。
第三类:Pre-existing Failure
和当前Diff无关。
应该记录:
Existing Issue
不要为了让CI全绿,
顺手修改另一个系统。
这就是:
Failure Classification。
十、为什么CI失败特别容易导致Scope Drift?
因为Agent的目标经常是:
让测试通过。
如果任务定义只有:
Tests must pass
Agent很可能自然扩大范围。
例如本来:
Fix auth bug
结果发现另一个测试失败。
Agent可能认为:
那我也一起修掉。
所以更好的任务定义应该是:
Fix auth bug
↓
Run related verification
↓
Do not modify unrelated failures
这时候:
Pass Test
才不会覆盖:
Task Boundary。
十一、第六步:PR Review之后,任务会进入Recovery阶段
Codex现在可以在当前项目处于PR Branch并拥有GitHub访问时,继续帮助处理Pull Request反馈。官方GitHub集成也支持让Codex直接Review PR Diff,并按照Repository Guidance给出标准GitHub Code Review。
真正复杂的地方是:
Reviewer提出修改以后,
PR已经不再处于第一次创建时的状态。
可能同时发生:
Reviewer Comment
+
New Main Commit
+
Agent New Change
+
CI Result
于是任务进入:
PR Recovery。
十二、什么叫PR Recovery?
可以理解成:
一个已经进入协作流程的PR发生变化以后,怎样重新建立一致状态。
例如:
PR
↓
CI Failed
↓
Agent Fix
↓
Reviewer Comment
↓
Agent Fix Again
↓
Main Updated
↓
Conflict
这时候最危险的是:
Agent仍然沿用最早的Task Context。
但GitHub中的实际PR已经经历了多轮变化。
所以Recovery第一步不是:
继续改。
而是:
Fetch Current State
↓
Review Current Diff
↓
Read Latest Comments
↓
Check CI
↓
Re-plan
也就是重新建立:
Current Truth。
十三、PR恢复最怕“旧上下文 + 新代码”
这和前面Thread Handoff是同一个底层问题。
例如Thread里记得:
文件A已经修好
但Reviewer后来又修改了文件A。
或者Main合并了新的实现。
这时候:
Thread Memory
≠
PR Reality
如果Agent不重新获取PR状态,
就会基于旧世界继续工作。
所以进入Recovery时应该先建立:
Latest Branch
Latest Diff
Latest Review
Latest CI
再继续。
十四、为什么PR Badge和PR状态值得关注?
Codex App持续增强Git和PR工作流,本质上就是在把Agent任务从:
Code Generation
进一步连接到:
Engineering Lifecycle
当前Codex App的Git功能已经覆盖Diff查看、Commit、Push、PR等常见操作,而Worktree和Review功能则让不同Agent任务以及PR反馈可以继续在同一工程工作流里推进。
这意味着开发者真正应该看的不只是:
Agent现在有没有在运行?
还要看:
这个任务在Git生命周期里到底处于哪一个状态?
十五、可以把Codex PR状态拆成6层
我建议以后不要只使用:
Running / Done
而是拆成:
1. Implementation
代码修改中
2. Diff Review
修改已完成,等待Diff确认
3. Git Ready
Branch / Commit状态正确
4. PR Open
Pull Request已创建
5. Verification
CI / Review进行中
6. Ready to Merge
验证通过,可进入最终合并
最后:
Task Done
才真正成立。
十六、什么状态才叫真正Code Done?
Code Done应该至少满足:
Expected Files Changed
No Unexpected Diff
Relevant Tests Passed
但这还只代表:
Implementation完成。
还不代表:
PR已经完成。
十七、什么状态才叫PR Done?
PR Done至少应该包含:
Correct Branch
Focused Diff
CI Passed
Review Resolved
No Unexpected Conflict
也就是说:
Code Done
+
Collaboration Done
=
PR Done
十八、什么状态才叫真正Task Done?
最终还要回到最原始的:
Goal。
假设任务是:
修复用户登录401。
即使PR已经Green,
还需要确认:
原始问题是否真正解决?
如果测试只是:
Unit Test Passed
但没有验证:
真实Session Refresh场景,
任务仍然可能没有真正闭环。
所以完整结构应该是:
Code Done
↓
PR Done
↓
Goal Verified
↓
Task Done
这四个词不能混用。
十九、一个比较稳定的Codex PR闭环流程
以后让Codex完成真实工程任务,可以直接按照下面顺序。
第一步:Implementation
让Agent完成修改。
第二步:Review Diff
检查:
Files
Scope
Unexpected Changes
Codex App本身就支持通过Diff面板直接Review当前修改。
第三步:Git Check
确认:
Branch
Base Revision
Commit
第四步:Create PR
保证PR只有:
One Goal。
第五步:Verification
等待:
CI
Review
Security
第六步:Recovery
如果失败:
Fetch Current State
↓
Classify Failure
↓
Fix Only Relevant Scope
↓
Re-run Verification
最终才:
Ready to Merge
二十、为什么PR Recovery以后一定要重新看Diff?
这是一个非常实用的习惯。
第一次修改时,
你可能Review过:
10 Files
后来Agent根据Review继续修改。
如果直接相信:
只是修了Reviewer提到的问题。
很容易漏掉新的变化。
所以每一次Recovery以后,
应该重新查看:
Current Full Diff
而不是只看:
Agent刚才说改了什么
Codex App本身提供当前完整Diff以及Last Turn Changes两种Review视角,这正适合分别处理“总体PR状态”和“Agent刚刚新增的修改”。
二十一、可以建立一套最小PR Recovery Checklist
以后PR断掉以后,不要马上说:
Codex继续修。
先检查:
1. Branch
现在在哪个Branch?
2. Base
目标Branch有没有更新?
3. Diff
当前完整Diff是什么?
4. CI
真正失败的是哪一个Check?
5. Review
最新Reviewer要求是什么?
6. Scope
这次修复是否仍然属于原始Goal?
然后:
Current State
↓
Re-plan
↓
Modify
↓
Verify
二十二、Agent越强,PR工程反而越重要
过去人一天可能提交:
1—3个PR。
Agent并行以后:
Agent A
Agent B
Agent C
Agent D
可能同时产生大量修改。
Codex现在本身就是围绕多Agent、Worktree和可Review Diff来设计这种并行工程模式。
这时候真正的瓶颈很容易从:
Code Generation
转移到:
Diff Review
Branch Management
PR Review
CI Recovery
Merge Coordination
也就是:
Integration。
二十三、未来Agent工程真正稀缺的可能不是代码,而是“可合并性”
如果Agent一天生成:
100个修改。
但只有:
20个能够顺利Review、验证、Merge,
真正有效产出还是:
20。
所以Agent时代非常重要的指标可能不是:
Code Produced
而是:
Verified PRs Merged
这和前面讲过的:
Verified Outcome
完全一致。
二十四、可以把整个链条压缩成一句话
很多Codex失败不是:
代码没有写出来。
而是:
Code
↓
没有成功进入Repository协作流程
真正稳定的Agent工程必须把:
Generate
连接到:
Integrate
最终形成:
Implement
↓
Review Diff
↓
Branch
↓
Commit
↓
PR
↓
CI
↓
Review
↓
Recovery
↓
Merge
这才是真正的:
Engineering Loop。
最后
Codex代码改完以后,
最容易产生的误判就是:
Task已经完成。
但真实工程里:
Code Done
≠
PR Done
同样:
PR Done
≠
Task Done
真正完整的状态应该是:
Code Done
↓
Git Ready
↓
PR Open
↓
CI Verified
↓
Review Resolved
↓
Goal Verified
↓
Task Done
Codex现在越来越多地支持Diff Review、Git操作、Worktree、GitHub Code Review以及PR反馈处理,本质上说明Agent正在从:
代码生成工具
进一步进入:
完整软件工程生命周期。
所以开发者真正需要建立的,也不能只是:
怎么让Codex把代码写对。
还应该包括:
怎么让Agent生成的修改能够稳定进入Branch、PR、CI和Review,并在流程中断以后可靠恢复。
当这一套能力成熟以后,
Codex才能真正从:
Code Agent
走向:
Engineering Agent。
持续更新Codex、大模型开发相关技术内容。
长期使用各类代码大模型,整理了稳定的AI会员订阅渠道。
更多推荐




所有评论(0)