文章

git-reset

重置 HEAD 到指定提交,修改暂存区和工作区状态。

git-reset

git reset

git reset 是 Git 中最强大也最容易误用的命令之一。它可以修改分支指针、重置暂存区、甚至擦除工作区的改动。

git reset 用于移动当前分支的 HEAD 到指定位置,并可选择是否同时修改 暂存区(Index)工作区(Working Directory)

基本语法

1
git reset [<mode>] <commit>
  • <commit>:你想“重置回去”的目标提交。

  • <mode>:行为模式(默认是 --mixed)。

三种主要模式

模式作用对象HEAD暂存区工作区常用语义说明
--soft仅 HEAD回退提交但保留所有改动(适合撤销 commit)
--mixed(默认)HEAD + 暂存区回退提交 + 暂存区,但保留工作区(适合撤销 add)
--hardHEAD + 暂存区 + 工作区所有改动回退,慎用(危险)

示例详解

git reset --soft HEAD~1

撤销最近一次提交,但保留改动(还在暂存区中):

1
git reset --soft HEAD~1

发现提交错了想重新整理一下 commit 内容,但代码不想动。

git reset --mixed HEAD~1(默认)

撤销最近一次提交 + 暂存区状态也恢复到旧状态,但工作区文件保留。

1
git reset HEAD~1

想撤销 git commit + git add,重新选择哪些文件要提交。

git reset --hard HEAD~1

彻底回退:提交记录、暂存区、工作区统统恢复到上一个提交状态

1
git reset --hard HEAD~1

危险操作,未保存的改动会永久丢失

更通用的 reset 操作

把某个文件从暂存区撤回(等价于 git restore --staged

1
git reset HEAD file.cpp
  • file.cpp 改动还在,但不再处于 staged 状态;
  • 等价于取消了 git add

指定 commit 回退当前分支

1
git reset --hard <commit-hash>

可以从 git log 中找出 hash 值,直接重置 HEAD 和分支指针。

git reset 的三块区域图示

1
2
3
4
5
6
7
8
              +----------------+
              |   HEAD 指向提交 |
              +----------------+
                       |
                       v
+-------------+   +--------------+   +---------------+
| 工作目录     |   | 暂存区index|   | 提交历史HEAD|
+-------------+   +--------------+   +---------------+
  • --soft:只改 HEAD(左边不变)

  • --mixed:改 HEAD 和 暂存区(工作区不变)

  • --hard:三者都改

注意事项与常见误解

问题解答
reset 会删除提交吗?如果没有分支指向旧提交,那些提交就会变为“悬挂提交”(dangling commits),会被 GC 清理
reset 会影响远程吗?不会立即影响,但如果你 git push -f,会改变远程历史(慎用)
如何恢复 reset 后丢失的提交?有可能用 git reflog 找回

误删怎么救回

1
2
git reflog
git checkout <原来的 commit 哈希>

或者:

1
git reset --hard <旧提交>

常用速查表

操作目标命令说明
撤销最近一次提交git reset --soft HEAD~1保留改动,退回未提交状态
撤销提交和 addgit reset --mixed HEAD~1保留工作区,退回未暂存状态
强行丢弃所有改动git reset --hard HEAD~1工作区也丢弃(危险)
撤销 git add filegit reset file把文件移出暂存区

git resetgit revert 区别

操作是否修改历史是否适合公开仓库说明
git reset✅ 会改历史❌ 不建议本地回退、清理历史
git revert❌ 不改历史✅ 安全添加一个“反向提交”
本文由作者按照 CC BY 4.0 进行授权