使用 git reset 命令回退历史
建议先阅读 Git 工作区、暂存区和版本库、Git 分支本质及与 commit、HEAD、tag 的关系。
简介
git reset
命令是用来将当前 branch 重置到另外一个 commit 的,也就是用来回退到指定 commit,根据不同的参数,这个动作可能同时影响到 Index 以及 Working Directory。
先举个例子,来一个感性的认识。下面这两条命令让 hotfix 分支向后回退两个提交。
git checkout hotfix git reset HEAD~2
![]() |
hotfix 分支末端的两个提交现在变成了孤儿提交。下次 Git 执行垃圾回收的时候,这两个提交会被删除。如果你的提交还没有共享给别人,可以用git reset
撤销这些提交。
reset 的作用
假设仓库历史是这样:
![]() |
现在,假设我们运行git reset HEAD~
(后面可能会跟不同的参数)。
1、移动 HEAD(--soft)
使用--soft
参数时,reset 会移动 HEAD 的指向。这与改变 HEAD 自身不同(checkout 所做的),reset 移动 HEAD 指向的分支。这意味着如果 HEAD 设置为 master 分支(例如,你正在 master 分支上),运行git reset --soft 9e5e6a4
将会使 master 指向 9e5e6a4。
![]() |
使用reset --soft
,仅仅会改变分支指向。
结合上图,我们理解一下发生的事情:它本质上是撤销了上一次 git commit 命令。当你在运行 git commit 时,Git 会创建一个新的提交,并移动 HEAD 所指向的分支来使其指向该提交。当你将它 reset 回 HEAD~(HEAD 的父结点)时,其实就是把该分支移回原来的位置,而不会改变索引和工作目录。
一个使用场景是,你发现最近一次的提交漏了一些改动,这时候可以使用
git reset --soft HEAD~
回退指针,注意运行命令后暂存区是没变的,只需要加入漏掉的改动到暂存区,重新提交即可实现和git commit --amend
一样的功能。
2、更新索引(--mixed)
git reset
默认参数为--mixed
,也就是git reset 9e5e6a4
等价于git reset --mixed 9e5e6a4
。
如果运行git reset --mixed 9e5e6a4
,除了像git reset --soft 9e5e6a4
那样改变分支指向外,还会用 HEAD 指向的当前快照的内容来更新索引。
![]() |
一个使用场景是,你发现最近一次的提交多提交了一些改动,这时候可以使用
git reset --mixed HEAD~
回退,运行命令后暂存区内容将会回到上次提交,此时重新加入需要提交的改动,再次提交即可。
3、更新工作目录(--hard)
如果使用 --hard 选项,reset 将会在 --mixed 的基础上,让工作目录和索引保持一致(不考虑忽略文件之类)。
![]() |
现在让我们回想一下刚才发生的事情:你撤销了最后的提交(git commit)、git add 和工作目录中的所有工作。
必须注意,--hard 标记是 reset 命令唯一的危险用法,它也是 Git 会真正地销毁数据的仅有的几个操作之一。其他任何形式的 reset 调用都可以轻松撤消,但是 --hard 选项不能,因为它强制覆盖了工作目录中的文件。
一个使用场景是,你发现最近一次的提交用不到了,比如需求变了,不再需要这个改动了,这时候可以使用
git reset --hard HEAD~
回退,运行命令后暂存区、工作区内容将会回到上次提交。接下来可以继续其他改动。注意该命令会覆盖掉工作区改动。
总结
reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:
- 移动 HEAD 指向的分支(若指定了
--soft
,则到此停止); - 重置 Index 以便和 HEAD 相匹配(若未指定
--hard
,则到此停止); - 使工作目录和索引保持一致。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!