双 Esc rewind 只回退对话,不还原已改文件;Esc 停错向 → rewind → git stash/restore → 缩小范围再开。

要点
- Codex CLI:输入框为空时连按两次 Esc,可浏览并回退到某条用户提示,从该点分叉重写(Developer commands|Interactive shortcuts)。证据强度:高(官方)。
- rewind 改的是对话上下文。第三方实测 CLI 回退后提示类似 “Conversation reverted… File changes are unchanged.”,后续轮次改过的文件仍在工作树(AICodeWith 双 Esc 测试)。证据强度:中高(第三方实测;文案以本机为准,待核)。
- OpenAI 曾暴露实验性
/undo快照,后因用量少、设计惹祸移除;官方回复建议用 git 提交/还原,或让模型按指示改回(Discussion #9618)。证据强度:高(OpenAI 职员口径)。 - 正确姿势:Esc 打断错向 → rewind 清污染上下文 →
git stash push -u或git restore收拾工作树 → 用“文件边界+失败路径+要走的路径”重开;别在同一脏上下文里加长提示硬刚。证据强度:高(官方快捷键+社区恢复指南对齐)。 - 验收用
/diff或git diff/git status;能 stash 就别reset --hard。证据强度:高(实践共识;error-recovery 指南 中高)。
正文
场景
Agent 刚把 Express 塞进你的 Fastify 服务,类型错误用三轮 as any 糊过去,测试还“绿”。你发现方向错了,第一反应是:把提示再写长一点,叫它“撤销刚才、按我们的栈重做”。
上下文里已经塞满错误路径。文件也脏了。再加长提示,等于让模型在垃圾堆上继续挖。
可跟做步骤/可抄工作流
证据强度:双 Esc=官方高;文件不随 rewind 回滚=第三方实测中高;/undo 已移除=Discussion #9618 高;git 步骤=公开恢复指南。
1. 先 Esc,别让这一轮继续写
Agent 还在改文件时,先按 Esc 打断当前回合。官方要求在空的 composer 上连按两次 Escape 才能编辑上一条用户消息并从该点 fork;第三方恢复指南补充:进行中的回合不能 rewind,须先打断再双 Esc。
2. 空输入框,连按两次 Esc,回到“跑偏前”那条提示
- 确认 composer 是空的。
- Esc × 2,进入 transcript 浏览。
- 左右键选中要回退到的用户消息,Enter(左右键浏览为第三方实测细节,官方快捷键段未写)。
- 原提示会填回输入框;改约束后再发,或 Esc 退出浏览。
官方表述:空 composer 上 Escape 两次,编辑上一条用户消息并从该点 fork(Developer commands)。
3. 立刻核对文件:rewind ≠ 还原磁盘
回退后跑:
git status --short
git diff --stat
会话里也可 /diff(含未跟踪文件)。若二、三轮改过的内容还在,这是预期行为:对话已回,工作树未回。AICodeWith 在 CLI 0.163.0 上三轮改文件后再 rewind,回退后界面写 “Conversation reverted to this point. File changes are unchanged.”,git diff 仍能看到后轮内容(实测文)。具体提示字符串以本机 CLI 为准(待核)。
4. 用 git 收拾工作树(优先 stash)
任务前有干净提交最省事。没有的话:
# 可恢复地搁置(含未跟踪文件)
git stash push -u -m "codex: wrong-turn before rewind"
# 或只丢掉已知坏文件
git restore -p src/
git restore src/routes/ src/server.ts
优先 stash,少用 reset --hard:stash 还能捞回半成品;hard 把已跟踪改动直接扔掉,新文件还可能留着。error-recovery 类指南同样强调:CLI 侧 per-turn undo 快照已移除,文件靠你自己的 git 检查点(developertoolkit)。OpenAI 在 #9618 也写过:实验性 /undo 已拿掉,多数人用 git 或让模型按指示改回。
5. 缩小范围再开——别在脏上下文里硬刚
工作树干净后,重写那条提示,至少钉三件事:
- 文件边界:只动
src/invoices/,别碰 CI/无关模块。 - 失败路径:上一轮做了什么、为何废弃(一两句)。
- 要走的路径:用现有
NotFoundError、加一条缺失发票测例,先出计划等你说 go。
可抄骨架:
上一轮已用 git stash 搁置。需求:/invoices 在发票不存在时返回 404 而非 500,
已有发票的响应形状不变。约束:只改 src/invoices/;用现有 NotFoundError;
加一条缺失发票测例。先列 3–5 步计划,等我说 go 再改文件。
污染太重时,/new 开新会话,把目标与约束写进第一条并附验收命令;长线程也可用 handoff 文件交接(恢复指南常见做法)。
6. 验收
git diff --stat
# 或会话内 /diff
# 再跑项目自己的 test/typecheck/lint,看退出码
文件列表对得上计划,门禁自己跑绿,再考虑提交。
真实用户诀窍/反例
- 诀窍:rewind 管嘴,git 管盘。 两套工具,别混成一个“撤销键”。
- 诀窍:错向第一秒就 Esc。 越往后,脏文件与脏上下文叠得越厚。
- 诀窍:stash -u 盖住新建文件。 只
restore跟踪文件时,Agent 新建的round2.txt之类还会躺着。 - 诀窍:重开提示写“别再做什么”。 比空泛“按最佳实践重做”管用。
- 反例:同一线程里把提示越写越长。 失败轨迹仍在上下文里,模型容易复读旧错。
- 反例:以为双 Esc 等于 Claude Code 式代码回滚。 官方快捷键只谈编辑消息与 fork;文件回滚靠 git。
- 反例:一怒之下
reset --hard。 可能丢掉你还想留的半截改动;先 stash。 - 反例:rewind 后不看
git status就重发。 旧改动还在,新一轮会叠在脏树上。
适用边界
- 本稿专攻:Codex CLI 失败恢复——对话 rewind 与文件还原分工;与“Cursor 里 Agent code review”“多文件重构完成定义”错开。
- 不覆盖:第三方 fork(如带文件快照的非官方 rewind 构建)、Desktop/IDE 扩展是否另有 fork 按钮、企业策略下的 worktree 强制流程。
- 双 Esc 提示文案、CLI 小版本行为以本机
codex与 Developer commands 现页为准(待核)。 - #9618 确认的是“实验性
/undo已移除”;社区另有“要完整代码 rewind”的功能请求,本稿不当成已上线能力。