快照可让你同时撤销最近的对话与文件更改。可用它们修订最近的工作,但重要改动请保留 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 数据目录视为敏感的本地数据。
设置
{
"$schema": "https://opencode.ai/config.json",
"snapshots": false,
}
停用快照不会删除已存储的快照。对话回滚仍然可用,但在没有已捕获文件系统状态的情况下,它无法恢复相关的文件更改。
安全性
快照是便利功能,而非事务或备份:
- Shell 命令可能更改服务、进程、网络资源、数据库、Git 状态、被忽略的输出,或活动目录之外的文件。恢复快照不会逆转这些影响。
- 当捕获失败或不存在可用的快照对时,中断或失败的工作可能留下更改。
- 恢复受影响的路径会覆盖其当前内容。取消已暂存的回滚也可能覆盖之后的编辑。
- OpenCode 会在会话运行期间拒绝回滚操作,但外部编辑器和命令仍可能在捕获与恢复之间更改工作树。
- 确认回滚只会从当前对话视图中移除消息,不会从持久会话历史或已有快照存储中删除。这不是安全擦除。
在有未提交更改的工作树上使用
/undo 之前,请提交或备份重要工作。