首页 / Git 入门教程 / 撤消操作

Git 入门教程

撤消操作

本教程共 26 篇 · 第 7 篇 · 更新于 2026-07-29 · 约 8 分钟阅读

GitGit 入门教程git restoregit resetgit revert撤消回退softmixedhard

7. 撤消操作

本节目标:学会在不同场景下撤消修改,理解 reset 三种模式的区别,知道 reset 和 revert 该怎么选。

撤消工作区的修改:git restore

你改了文件,还没 add,想放弃改动:

git restore readme.txt

文件会回到最后一次 commit 或 add 时的状态。

Warning

这个操作不可逆。工作区的改动会直接消失,没有确认提示。确定不要了再执行。

旧写法是 git checkout -- readme.txtrestore 是 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。

场景用哪个原因
本地提交写错了,还没 pushreset没人看到,直接回退
已经 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:只动 HEAD
  • git reset --mixed(默认):动 HEAD + 暂存区
  • git reset --hard:三棵树全动,危险操作
  • git revert:创建反向提交,适合公共分支
  • 决策原则:本地用 reset,共享用 revert

下一章,我们学习 .gitignore——告诉 Git 哪些文件不用管。