快照可让你同时撤销最近的对话与文件更改。可用它们修订最近的工作,但重要改动请保留 Git 提交或备份。

工作流

在你想要修订的回复之后运行 /undo。OpenCode 会暂存回滚、恢复受影响的文件,并把被移除的提示词放回输入框,供你编辑。
/undo

# Edit the restored prompt, then submit it again.
Add validation without changing the public API.
提交编辑后的提示词即可确认已暂存的回滚。在提交之前,运行 /redo 可取消它,并恢复到执行 /undo 之前的对话与文件。
/redo
终端界面还提供默认快捷键:
| 操作 | 命令 | 快捷键 | | --- | --- | --- | | 暂存上一条消息的回滚 | /undo | <leader>u | | 取消已暂存的回滚 | /redo | <leader>r |
你也可以选择较早的消息,然后选择 Revert,以暂存回滚到该时间点。

捕获

对于每个模型步骤,OpenCode 会在模型调用前立即尝试拍摄一张快照,并在该步骤达到已记录的成功或失败状态时再拍摄一张。助手消息会记录这两张快照之间发生变化的路径。
before model step ── snapshot A
model edits src/api.ts
step finishes ────── snapshot B ── changed: src/api.ts
捕获是尽力而为的。如果任一快照不可用,对话会继续,但该步骤可能没有可恢复的文件更改。

范围

快照覆盖会话在 Git 工作树中的活动目录。例如,在 packages/app 中打开的会话只会捕获 packages/app 下符合条件的文件,而不会捕获仓库中其他位置的更改。
| 内容 | 是否捕获 | 示例 | | --- | --- | --- | | 活动目录内已跟踪的文件 | 是 | packages/app/src/app.tsx | | 未被忽略且每个不超过 2 MiB 的未跟踪文件 | 是 | packages/app/notes.txt | | 被 Git 忽略的文件 | 否 | packages/app/dist/app.js | | 大于 2 MiB 的单个未跟踪文件 | 否 | packages/app/debug.log | | 活动目录之外的文件 | 否 | packages/server/src/index.ts | | Git 元数据及其他副作用 | 否 | 提交、分支、数据库或进程 |
文件系统快照需要 Git 仓库。在仓库之外,/undo 仍可回滚对话历史,但无法恢复文件。

恢复

回滚只会恢复归属于所选对话边界之后助手步骤的路径。每个路径会返回到第一个被撤销步骤之前的状态;若某个文件由这些步骤创建且当时并不存在,则会被删除。
| 时间线 | src/api.ts | src/new.ts | | --- | --- | --- | | 所选边界 | 版本 A | 不存在 | | 其后的助手步骤 | 版本 B | 已创建 | | 回滚之后 | 版本 A | 已删除 |
未归属于这些步骤的路径不受影响。对受影响路径的当前编辑可能被覆盖,因此请在继续之前查看恢复摘要和 git diff。
git diff --stat
git diff

存储

OpenCode 将快照本地存储在其数据目录下的独立内部 Git 对象数据库中。快照捕获不会创建提交、移动分支,或有意更改你的仓库索引。
# Your repository remains an ordinary dirty worktree after capture.
git status --short
快照对象可能包含已跟踪文件和符合条件的未跟踪文件的完整内容。请将 OpenCode 数据目录视为敏感的本地数据。

设置

快照默认启用。在你的配置中将 snapshots 设为 false,即可停止今后的文件系统捕获。
{
  "$schema": "https://opencode.ai/config.json",
  "snapshots": false,
}
停用快照不会删除已存储的快照。对话回滚仍然可用,但在没有已捕获文件系统状态的情况下,它无法恢复相关的文件更改。

安全性

快照是便利功能,而非事务或备份:
  • Shell 命令可能更改服务、进程、网络资源、数据库、Git 状态、被忽略的输出,或活动目录之外的文件。恢复快照不会逆转这些影响。
  • 当捕获失败或不存在可用的快照对时,中断或失败的工作可能留下更改。
  • 恢复受影响的路径会覆盖其当前内容。取消已暂存的回滚也可能覆盖之后的编辑。
  • OpenCode 会在会话运行期间拒绝回滚操作,但外部编辑器和命令仍可能在捕获与恢复之间更改工作树。
  • 确认回滚只会从当前对话视图中移除消息,不会从持久会话历史或已有快照存储中删除。这不是安全擦除。
在有未提交更改的工作树上使用 /undo 之前,请提交或备份重要工作。