# 取消 GitHub Copilot CLI 操作并回滚更改

了解取消活动 Copilot 操作的不同方法，以及如果结果不符合预期如何回滚会话期间所做的更改。

## Introduction

在交互式 Copilot CLI 会话中工作时，可以按 <kbd>Esc</kbd> 或 <kbd>Ctrl</kbd>+<kbd>C</kbd> 来控制 Copilot 正在执行的操作。 两个键压都可以取消操作，但它们的工作方式略有不同：

* <kbd>Ctrl</kbd>+<kbd>C</kbd> 会立即生效，无需再次按下进行确认——首先移除所有已排队的提示（每按一次移除一个），然后取消当前操作。
* 单次按下 <kbd>Esc</kbd> 键可让你进行更渐进的分阶段控制。 当 Copilot 正在运行时，按一次 <kbd>Esc</kbd> 不会立即取消，而是会先显示提醒；再次按下则会执行下一步操作：移除最近加入队列的提示，如果队列已空，则取消该操作。

如果 Copilot 已进行更改并想要撤消这些更改，则可以回滚到会话中的上一点。 按 Copilot 原样跟踪 Copilot CLI 文件更改，因为它会响应每个提示。 这样，便可以在空闲时Copilot按 <kbd>Esc</kbd> 两次，输入区域为空，从而回退到早期点。 回退时，可以选择是仅回退对话，还是还原已更改的文件 Copilot 。

## 按 Esc 在不同情况下执行的操作

按 <kbd>Esc</kbd> 一次会执行不同的操作，具体取决于会话的当前状态：

| 当前状态                  | 按 <kbd>Esc</kbd> 执行的操作                                                       |
| --------------------- | ---------------------------------------------------------------------------- |
| Copilot 处于活动状态，无排队提示。 | 显示“再次 Esc 以取消”提醒。 仅当在半秒内再次按 <kbd>Esc</kbd> 时，才会取消正在运行的操作。                    |
| Copilot 处于活动状态，有排队提示。 | 显示“再次 Esc 以取消”提醒。 再次按 <kbd>Esc</kbd> 会删除最近排队的提示。                             |
| 权限对话框处于打开状态。          | 按一次 <kbd>Esc</kbd> 即可拒绝当前待处理的请求（无需再次按下）。                                     |
| 对话框、覆盖层或选择器已打开。       | 关闭对话框、覆盖或选取器。                                                                |
| Copilot 处于空闲状态。       | 显示一个简短的提醒，即再次按 <kbd>Esc</kbd> 会快速打开回退选取器。 请参阅 [回滚更改](#rolling-back-changes)。 |

当处于空闲状态时Copilot，按 <kbd>Esc</kbd> 两次可让你回滚到会话中的早期点。 如果操作正在进行，则双 <kbd>Esc</kbd> 按优先级顺序执行以下操作之一：

* 取消正在运行的 shell 命令。
* 停止当前响应。
* 停止后台代理。
* 清除输入区域中的文本。
* 退出 shell 模式。

如果未应用这些选项，则会显示回退选取器。

## 何时使用 Esc 而不是 Ctrl+C

取消操作的这两种方法的主要区别在于 <kbd>Esc</kbd> 旨在逐步、有针对性的干预，而 <kbd>Ctrl</kbd>+<kbd>C</kbd> 是一个硬停止。

在希望与 <kbd></kbd> 交互而不一定结束当前操作时，请使用 Copilot。 例如，如果出现权限对话框并想要拒绝此请求，按 <kbd>Esc</kbd> 键将关闭对话框，并继续 Copilot 工作，只是不会使用你拒绝的工具。 同样，如果已将后续提示排入队列，并且想要取消它们，而不会中断正在进行的工作，请按 <kbd>Esc</kbd> 会删除最近排队的提示（重复删除早期提示），而当前操作会继续运行。

如果想要取消，而无需确认第二次按 <kbd>Esc</kbd>，请使用 +<kbd></kbd><kbd>C</kbd>。 如果没有提示正在队列中，按一次 <kbd>Ctrl</kbd>+<kbd>C</kbd> 会立即取消当前操作。 如果有排队中的提示，则每按一次 <kbd>Ctrl</kbd>+<kbd>C</kbd>，都会移除最近加入队列的那个提示，每次只移除一个；只有在队列为空时，才会取消当前操作。 正在进行的任何文件写入都将完成（文件未在写入中损坏），但将放弃所有剩余的计划更改。 在输入区域为空的情况下，在两秒内再次按下 <kbd>Ctrl</kbd>+<kbd>C</kbd> 键，将完全退出会话。

作为经验法则，当您想要有选择地进行干预时，请使用 <kbd>Esc</kbd>；当您想要停止并重新开始时，请使用 <kbd>Ctrl</kbd>+<kbd>C</kbd>。

## 回滚更改

当 Copilot 处于非活动状态且输入区域中没有文本时，可以按 <kbd>Esc</kbd> 两次以显示当前会话中可回滚到的点列表。 每个点对应于提交的提示，回退会将会话返回到该会话在开始处理该提示之前 Copilot 立即处于的状态。

选择倒退点后，决定是否：

* **仅回退对话**，使文件保持不变。
* **倒退对话和还原文件**，这会还原文件 Copilot 更改，同时保留自己的以后编辑。

因为它仅还原更改的文件 Copilot ，而不是整个工作区，因此回退可以在任何目录中工作，包括不是 Git 存储库的文件夹。

有关如何使用双击 <kbd>Esc</kbd> 键回滚会话期间所做更改的完整详细信息，请参阅 [回退 GitHub Copilot CLI 会话期间所做的更改](/zh/copilot/how-tos/copilot-cli/use-copilot-cli/roll-back-changes)。

> \[!WARNING]
> 倒退会将整个工作区还原到所选快照中的状态。 这将还原在该点之后所做的所有更改——不仅包括由Copilot所做的更改，还包括任何手动编辑以及由 shell 命令导致的更改。 删除快照后在工作区中创建的任何新文件，而不考虑其 Git 状态。

### 回滚时会发生什么情况

回滚时发生的操作取决于所选选项。

如果选择倒退对话 **和** 还原文件：

1. **文件已还原。** 更改的文件 Copilot 将还原到所选提示之前的状态。 当前内容不再与上次写入的内容 Copilot 相匹配的文件（例如，因为你自己编辑了它们），因此不会覆盖以后的编辑。
2. **会话历史记录将被截断。** 对话将重新移动到所选点。 从会话中删除在该点之后发生的所有消息和工具调用。
3. **已删除过时的快照。** 已清除已放弃轮次的捕获文件更改。 早期点仍可用于未来的倒退。
4. **回滚已确认。** 回滚后， Copilot 显示一条消息，指示已还原的文件数，并记录跳过的任何文件。
5. **你的提示已恢复。** 与所选点关联的提示放置在输入区域中，以便可以编辑并重新提交它。

如果选择仅回退对话，则文件保持不变：会话历史记录被截断（步骤 2），提示将还原到输入区域（步骤 5）。

### 无法回滚的更改

在以下情况下，将跳过文件还原或不可用：

* **文件超过 10 MB。** 捕获期间会跳过大于 10 MB 的单个文件，因此在回滚期间不会还原对这些文件的更改。
* **超过 500 个已更改的文件。** 如果在单个轮次期间更改了 500 多个文件，则不会捕获该轮次的文件更改，因此无法还原文件。 其他轮次不受影响。
* **你自己更改的文件。** 当前内容不再与上次写入的内容匹配 Copilot 的文件保持不变，而不是被覆盖。
* **没有文件跟踪的会话。** 如果在启用文件更改跟踪之前恢复启动的会话，则只有对话回退可用。 启动一个新会话，以便能够还原文件更改。
* **远程支持的或繁忙的会话。** Rewind 不适用于远程支持的会话，或者会话仍在进行中。

## 延伸阅读

* [GitHub Copilot CLI 命令参考](/zh/copilot/reference/copilot-cli-reference/cli-command-reference)