取消与回滚¶
本文你会学到:
- 🛑
Esc与Ctrl+C的行为差异及各自适用场景 - 📸 工作区快照的自动创建机制与回滚原理
- ⏪ 使用
/undo、/rewind或双击Esc回滚变更 - ⚠️ 哪些变更无法通过回滚恢复
在使用 Copilot CLI 时,就像你在 IDE 里操作一样——有时候 Copilot 的执行结果不是你想要的,或者它正在做一件你突然想叫停的事情。Esc 和 Ctrl+C 就是你的"刹车":一个像轻踩刹车(选择性干预),一个像拉手刹(硬停止)。而当你发现 Copilot 已经改了一堆文件想全部撤回时,快照回滚就是你的"时光机"。
Esc 与 Ctrl+C 的行为对比¶
Esc 是一个**上下文感知**的按键——它的行为取决于当前会话状态:
| 当前状态 | Esc 行为 |
|---|---|
| Copilot 活跃,无排队提示 | 取消当前正在运行的操作 |
| Copilot 活跃,有排队提示 | 清除排队的提示(不影响当前操作) |
| 对话框 / 选择器 / 覆盖层已打开 | 关闭对话框、选择器或覆盖层 |
| Copilot 空闲 | 显示提示:再次按 Esc 将打开回滚选择器 |
Ctrl+C 则是**一刀切的硬停止**:
- 立即取消当前操作,并清除所有排队的提示
- 已在进行中的文件写入会完成(不会留下损坏的半写文件),但其余计划变更全部放弃
- 在输入区为空时,2 秒内再次按
Ctrl+C将**退出整个会话**
何时用 Esc vs Ctrl+C¶
核心区别:Esc = 选择性干预,Ctrl+C = 硬停止。
| 场景 | 推荐 | 原因 |
|---|---|---|
| 弹出权限对话框,想拒绝某个工具请求 | Esc |
只关闭对话框,Copilot 继续工作,只是不使用被拒绝的工具 |
| 排了多个后续提示,想取消后面的 | Esc |
只清除队列,当前操作不受影响 |
| 当前操作方向完全错误,需要立即停止 | Ctrl+C |
一键停止所有操作和排队 |
| 想彻底退出 Copilot CLI | Ctrl+C 连按两次 |
快速退出会话 |
经验法则:想选择性干预用 Esc,想停下来重新开始用 Ctrl+C。
工作区快照¶
Copilot CLI 在每次你输入提示时,会**自动创建工作区快照**——在 Copilot 开始处理之前捕获当前状态。这个快照就是你日后回滚的"存档点"。
快照内容包括:
- Git 状态:当前的 commit SHA 和分支名
- 文件内容:所有已修改文件的备份内容
- 文件权限:文件的读写权限状态
- 暂存状态:哪些文件已被
git add
前提条件:你必须在一个至少有一个 commit 的 Git 仓库中工作。Copilot CLI 依赖 Git 操作来跟踪和恢复工作区状态。
回滚选择器默认显示最近 10 个快照,超过 10 个时可通过方向键向下滚动查看更早的快照。每个快照旁边会显示对应的提示词开头和提交时间。
回滚操作¶
有三种方式打开回滚选择器:
- 双击
Esc:在 Copilot 空闲且输入区为空时快速连按两次 /undo命令:直接输入斜杠命令/rewind命令:/undo的别名,效果完全相同
使用回滚选择器¶
- 确保 Copilot 空闲且输入区为空
- 按
EscEsc(或输入/undo)打开回滚选择器 - 使用 上下方向键 浏览快照列表
- 按
Enter确认回滚到选定的快照
仓库会恢复到快照对应的提示词被提交**之前**的状态,而非执行完之后。
回滚的执行过程¶
选中快照后,Copilot CLI 按以下步骤执行回滚:
- Git 恢复:将仓库检出到快照记录的 commit 和分支
- 清理未跟踪文件:删除快照之后创建的新文件
- 恢复修改文件:将变更文件还原到快照时的内容(含权限和暂存状态)
- 截断会话历史:移除快照之后的所有对话消息和工具调用
- 删除快照:选定快照及其后的所有快照被永久删除
- 确认回滚:显示恢复了多少个文件
- 恢复提示词:将快照对应的提示词放入输入区,方便修改后重新提交
回滚不可逆
回滚会恢复整个工作区到选定的快照状态——不仅是 Copilot 的变更,也包括你手动编辑的内容和 Shell 命令的结果。回滚后创建的新文件会被删除。一旦回滚完成,无法撤销。
无法回滚的情况¶
以下情况不创建快照,也就无法回滚:
- 单个文件超过 10 MB:快照创建时跳过该文件,回滚不会恢复对它的变更
- 单步变更超过 500 个文件:该步骤不创建快照,但更早的快照不受影响
此外,会话中**第一个提示之前**的状态也无法回滚,因为第一个快照在第一次输入提示时才创建。
验证回滚¶
回滚完成后,可以在 Copilot CLI 输入区使用 ! 前缀直接执行 Shell 命令来验证仓库状态:
| 目的 | 命令 |
|---|---|
| 查看文件修改、暂存和未跟踪状态 | ! git status |
| 查看当前 commit 的 SHA 和提交信息 | ! git log --oneline -1 |
| 查看未暂存的变更内容 | ! git diff |
这样无需退出 CLI 就能确认回滚结果是否符合预期。
命令速查¶
| 命令 / 按键 | 功能 |
|---|---|
/undo |
打开回滚选择器 |
/rewind |
打开回滚选择器(/undo 的别名) |
Esc |
上下文感知:取消操作 / 关闭对话框 / 清除队列 |
Esc Esc |
快速连按两次打开回滚选择器 |
Ctrl+C |
立即停止当前操作并清除队列 |
Ctrl+C Ctrl+C |
2 秒内连按两次退出会话 |
! git status |
在 CLI 内验证仓库状态 |