第 6 章:安全撤销:restore、reset、revert
学习目标
- 区分撤销工作区、撤销暂存区、撤销已提交历史。
- 理解
restore、reset、revert的适用场景。 - 避免在共享分支上随意改写历史。
- 先备份再做高风险操作。
6.1 撤销前先问三个问题
撤销命令最容易让新手紧张。执行前先问:
| 问题 | 含义 |
|---|---|
| 改动提交了吗 | 未提交和已提交的处理方式不同 |
| 改动推送了吗 | 已推送的共享历史更谨慎 |
| 是想保留文件还是丢弃文件 | 有些命令会丢工作区内容 |
不确定时先运行:
Git Bash / macOS / Linux
git status
git log --oneline -56.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如果结果不对,至少还有一个分支指向原来的提交。
本章练习
- 修改 README,不暂存,运行
git restore README.md。 - 修改 README,暂存,再运行
git restore --staged README.md。 - 创建一条测试提交,用
git reset --soft HEAD~1撤销它。 - 再创建一条测试提交,用
git revert生成反向提交。
检查点
- 你知道
restore主要处理文件内容和暂存状态。 - 你知道
reset可能改写本地历史。 - 你知道共享分支撤销优先使用
revert。