撤消操作
本教程共 26 篇 · 第 7 篇 · 更新于 2026-07-29 · 约 8 分钟阅读
7. 撤消操作
本节目标:学会在不同场景下撤消修改,理解 reset 三种模式的区别,知道 reset 和 revert 该怎么选。
撤消工作区的修改:git restore
你改了文件,还没 add,想放弃改动:
git restore readme.txt
文件会回到最后一次 commit 或 add 时的状态。
Warning这个操作不可逆。工作区的改动会直接消失,没有确认提示。确定不要了再执行。
旧写法是 git checkout -- readme.txt。restore 是 Git 2.23 引入的更清晰的新命令。
撤消暂存区:git restore —staged
你 add 了,但还没 commit,想取消暂存:
git restore --staged readme.txt
文件回到工作区,改动还在,只是暂存区被清空了。
旧写法是 git reset HEAD readme.txt。
git reset:回退版本
git reset 是”时光机”,把分支指针移动到历史某个提交。它有三个模式,区别在于影响范围。
—soft:只动 HEAD
只移动分支指针,暂存区和工作区不变:
git reset --soft HEAD~
效果:回退到上一个提交,但所有改动都还在暂存区。适合”重新提交上一次”的场景。
—mixed(默认):动 HEAD + 暂存区
移动分支指针,重置暂存区,工作区不变:
git reset HEAD~
效果:回退到上一个提交,改动都回到工作区(未暂存状态)。这是默认行为。
—hard:三棵树全动
移动分支指针,重置暂存区,重置工作区:
git reset --hard HEAD~
效果:彻底回到上一个提交,工作区的改动全部丢弃。
Warning
--hard是真正的”销毁数据”。工作区未提交的改动会永久丢失。执行前请三思。
三种模式对比
| 模式 | HEAD | 暂存区 | 工作区 |
|---|---|---|---|
| —soft | 移动 | 不动 | 不动 |
| —mixed | 移动 | 重置 | 不动 |
| —hard | 移动 | 重置 | 重置 |
git revert:创建反向提交
git reset 是”回到过去”,git revert 是”创建一个新的提交来抵消某次提交”。
git revert abc123d
Git 会创建一个新的提交,内容是 abc123d 的反向操作。历史记录完整保留。
reset vs revert 怎么选
这块确实容易混。一句话:
本地未推送的改动,用 reset。已经共享的历史,用 revert。
| 场景 | 用哪个 | 原因 |
|---|---|---|
| 本地提交写错了,还没 push | reset | 没人看到,直接回退 |
| 已经 push 到远程 | revert | 别人可能已经拉了你的提交 |
| 想合并多个提交 | reset --soft | 重新整理后再提交 |
| 公共分支上的错误提交 | revert | 不破坏他人历史 |
Note为什么已共享的历史不能用 reset?因为 reset 会”抹掉”提交。如果别人已经基于你的提交开发了,他们的历史会断掉。revert 是”加一条新记录”,不影响别人。
实际场景演示
场景一:提交信息写错了
git commit -m "拼写错了"
git commit --amend -m "正确的提交信息"
--amend 修改最近一次提交,不会多出一个提交记录。
场景二:漏了一个文件
git commit -m "add feature"
git add forgotten-file.txt
git commit --amend
第二次提交会合并到第一次里,对外只看到一个提交。
场景三:本地回退两个提交
git reset --hard HEAD~2
彻底回到两个提交之前的状态。
场景四:公共分支撤销某次提交
git revert abc123d
创建新提交来抵消 abc123d 的影响,历史完整保留。
这章学到了什么
git restore:撤消工作区修改git restore --staged:取消暂存git reset --soft:只动 HEADgit reset --mixed(默认):动 HEAD + 暂存区git reset --hard:三棵树全动,危险操作git revert:创建反向提交,适合公共分支- 决策原则:本地用 reset,共享用 revert
下一章,我们学习 .gitignore——告诉 Git 哪些文件不用管。