跳转到内容

撤销与重做命令

概述

OpenCode 中的 /undo/redo 命令提供了强大的功能,用于管理代码修改和对话历史。这些命令允许你回溯和恢复更改,为你的开发工作流程提供灵活性和控制权。

命令参考

/undo

撤销对话中的最后一条消息或代码修改。这需要 Git 仓库。

快捷键Ctrl+X U

/redo

重做之前撤销的消息或代码修改。这需要 Git 仓库。

快捷键Ctrl+X R

工作原理

OpenCode 使用 Git 的版本控制功能来跟踪对话期间所做的更改。当你使用 /undo 时,它会:

  1. 记录对话的当前状态
  2. 恢复到之前的状态
  3. 更新 Git 历史以反映此更改

同样,当你使用 /redo 时,它会:

  1. 检查 Git 历史中之前撤销的更改
  2. 恢复最近的撤销状态
  3. 更新对话以反映此恢复

操作演示

基本撤销/重做工作流程

# 开始对话
> 解释如何实现二分搜索算法

# 收到包含代码实现的响应
AI: 这是 Python 中的二分搜索实现...

# 意识到你想要询问不同的语言
> /undo

# 改为请求 JavaScript 实现
> 解释如何用 JavaScript 实现二分搜索算法

# 收到 JavaScript 实现
AI: 这是 JavaScript 中的二分搜索实现...

# 决定你终究还是更喜欢 Python 版本
> /undo
> /redo

# 现在回到 JavaScript 实现

代码修改工作流程

# 从一个文件开始
> @src/utils.js

# 要求 AI 重构代码
> 重构此代码以使用箭头函数

# AI 修改文件
AI: 我已经将代码重构为使用箭头函数...

# 审查更改并决定你不喜欢它们
> /undo

# 请求不同的重构方法
> 重构此代码以使用更具描述性的变量名

# AI 应用新的更改
AI: 我已经更新了变量名,使其更具描述性...

常见场景

1. 纠正错误

场景:你不小心问了错误的问题或提供了不正确的信息。

解决方案

> Python 中 for 循环的语法是什么?
AI: 这是在 Python 中编写 for 循环的方法...
> /undo
> Java 中 for 循环的语法是什么?

2. 探索不同方法

场景:你想探索问题的多种解决方案。

解决方案

> 如何在 JavaScript 中对数组排序?
AI: 这是如何使用 Array.sort() 对数组排序...
> /undo
> 如何在不使用内置方法的情况下在 JavaScript 中对数组排序?
AI: 这是如何实现冒泡排序算法...
> /undo
> /redo
# 现在回到第一个解决方案

3. 管理代码更改

场景:你想尝试不同的代码修改,而不丢失原始代码。

解决方案

> @src/app.js
> 优化此代码以提高性能
AI: 我通过...优化了代码
> /undo
> 重构此代码以提高可读性
AI: 我通过...将代码重构为更具可读性
> /undo
> 结合两种优化

4. 从不良建议中恢复

场景:AI 提供的解决方案不起作用或引入了错误。

解决方案

> 修复我代码中的这个错误:@src/error.js
AI: 我通过...修复了错误
> !node test.js
Error: ...
> /undo
> 以不同的方式修复此错误

撤销功能的重要性

撤销功能至关重要,原因如下:

  1. 安全网:如果更改不如预期工作,提供恢复更改的方法
  2. 实验:鼓励尝试不同的方法,而不必担心破坏事物
  3. 学习:允许你并排比较不同的解决方案
  4. 效率:当更改不符合预期时,避免手动返工,节省时间
  5. 信心:让你有信心探索复杂的代码修改

最佳实践

何时使用撤销/重做

  • 在进行重大更改之前:撤销之前的更改,以从干净的状态开始
  • 收到意外结果后:撤销以恢复到已知的良好状态
  • 探索多个选项时:使用撤销/重做比较不同的解决方案
  • 代码审查期间:撤销更改以查看原始代码,然后重做以查看修改

有效使用的提示

  • 使用键盘快捷键Ctrl+X U 用于撤销,Ctrl+X R 用于重做,以节省时间
  • 与其他命令结合使用:将 /undo/compact 结合使用来管理长对话
  • 注意 Git 要求:在使用这些命令之前,确保你的项目位于 Git 仓库中
  • 检查 Git 状态:有时检查 !git status 有助于了解正在跟踪哪些更改

故障排除

常见问题

  1. 未初始化 Git:如果你收到有关 Git 的错误,请使用 !git init 初始化仓库
  2. 没有要撤销的更改:如果 /undo 不起作用,你可能已经到达对话的开始
  3. 没有要重做的更改:如果 /redo 不起作用,你可能已经到达最近的状态
  4. Git 冲突:在极少数情况下,可能会发生 Git 冲突 - 使用标准 Git 工具解决它们

错误消息

  • “Git repository not found”:在项目目录中初始化 Git 仓库
  • “No changes to undo”:你已经到达对话的开始
  • “No changes to redo”:你已经到达最近的状态

高级用法

与 Git 命令结合使用

你可以将 OpenCode 的撤销/重做命令与 Git 命令结合使用,以获得更强大的版本控制:

# 使用 OpenCode 进行更改
> @src/main.js
> 为此函数添加错误处理

# 检查 Git 状态
> !git status

# 如有需要,撤销
> /undo

# 满意时提交更改
> !git add src/main.js
> !git commit -m "Add error handling"

计划模式中的撤销/重做

使用计划模式时,撤销/重做命令的工作方式类似,但也会影响计划状态:

> /plan
> Task 1: 实现用户认证
> Task 2: 添加数据库集成
> Task 3: 创建 API 端点
> /plan finalize

# 撤销以修改计划
> /undo
> Task 3: 创建 RESTful API 端点
> /plan finalize

结论

/undo/redo 命令是 OpenCode 中管理代码修改和对话历史的基本工具。通过为实验提供安全网和比较不同方法的方法,这些命令使你能够更自信、更高效地工作。记住将它们与 Git 结合使用以获得最佳结果,并且不要犹豫尝试不同的解决方案,因为你知道如果需要,你始终可以回溯。