SilverIce Toolbox
Back to course

Stage 2 / Chapter 6

第 6 章:安全撤销:restore、reset、revert

学习目标

  • 区分撤销工作区、撤销暂存区、撤销已提交历史。
  • 理解 restoreresetrevert 的适用场景。
  • 避免在共享分支上随意改写历史。
  • 先备份再做高风险操作。

6.1 撤销前先问三个问题

撤销命令最容易让新手紧张。执行前先问:

问题含义
改动提交了吗未提交和已提交的处理方式不同
改动推送了吗已推送的共享历史更谨慎
是想保留文件还是丢弃文件有些命令会丢工作区内容

不确定时先运行:

Git Bash / macOS / Linux
git status
git log --oneline -5

6.2 撤销工作区修改

如果文件修改错了,还没有暂存,可以丢弃工作区修改:

Git Bash / macOS / Linux
git restore README.md

这个命令会让 README.md 回到最近提交或暂存区中的样子。它会丢掉当前工作区修改,执行前要确认不需要这些内容。

6.3 取消暂存

如果你已经 git add,但还不想提交某个文件:

Git Bash / macOS / Linux
git restore --staged README.md

这个命令只把文件从暂存区拿下来,不会删除工作区里的修改。取消暂存后还能继续编辑。

6.4 回退本地提交

如果最近一次提交还没推送,并且你想拆开重做,可以用:

Git Bash / macOS / Linux
git reset --soft HEAD~1

--soft 会撤销提交,但保留暂存区内容。适合改提交信息或补一点内容。

如果想撤销提交并把内容放回工作区:

Git Bash / macOS / Linux
git reset --mixed HEAD~1

新手应避免随手用 git reset --hard。它会丢弃工作区和暂存区修改,除非你确认那些内容完全不需要。

6.5 撤销已共享提交

如果提交已经推送到团队共享分支,优先用 revert

Git Bash / macOS / Linux
git revert <commit>

revert 会新增一条反向提交,而不是改写已有历史。这让其他人拉取时更安全。

6.6 高风险操作前建临时分支

不确定某个撤销命令会发生什么时,可以先保存当前位置:

Git Bash / macOS / Linux
git branch backup-before-undo

如果结果不对,至少还有一个分支指向原来的提交。

本章练习

  1. 修改 README,不暂存,运行 git restore README.md
  2. 修改 README,暂存,再运行 git restore --staged README.md
  3. 创建一条测试提交,用 git reset --soft HEAD~1 撤销它。
  4. 再创建一条测试提交,用 git revert 生成反向提交。

检查点

  • 你知道 restore 主要处理文件内容和暂存状态。
  • 你知道 reset 可能改写本地历史。
  • 你知道共享分支撤销优先使用 revert