跳转至

取消与回滚

本文你会学到

  • 🛑 EscCtrl+C 的行为差异及各自适用场景
  • 📸 工作区快照的自动创建机制与回滚原理
  • ⏪ 使用 /undo/rewind 或双击 Esc 回滚变更
  • ⚠️ 哪些变更无法通过回滚恢复

在使用 Copilot CLI 时,就像你在 IDE 里操作一样——有时候 Copilot 的执行结果不是你想要的,或者它正在做一件你突然想叫停的事情。EscCtrl+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 的别名,效果完全相同

使用回滚选择器

  1. 确保 Copilot 空闲且输入区为空
  2. Esc Esc(或输入 /undo)打开回滚选择器
  3. 使用 上下方向键 浏览快照列表
  4. Enter 确认回滚到选定的快照

仓库会恢复到快照对应的提示词被提交**之前**的状态,而非执行完之后。

回滚的执行过程

选中快照后,Copilot CLI 按以下步骤执行回滚:

  1. Git 恢复:将仓库检出到快照记录的 commit 和分支
  2. 清理未跟踪文件:删除快照之后创建的新文件
  3. 恢复修改文件:将变更文件还原到快照时的内容(含权限和暂存状态)
  4. 截断会话历史:移除快照之后的所有对话消息和工具调用
  5. 删除快照:选定快照及其后的所有快照被永久删除
  6. 确认回滚:显示恢复了多少个文件
  7. 恢复提示词:将快照对应的提示词放入输入区,方便修改后重新提交

回滚不可逆

回滚会恢复整个工作区到选定的快照状态——不仅是 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 内验证仓库状态