使用 git reset 命令回退历史

基于:git reset 命令详解(一)—— Git 学习笔记 07

建议先阅读 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 add 和 git commit 的命令执行之前。

一个使用场景是,你发现最近一次的提交多提交了一些改动,这时候可以使用git reset --mixed HEAD~回退,运行命令后暂存区内容将会回到上次提交,此时重新加入需要提交的改动,再次提交即可。

3、更新工作目录(--hard)

如果使用 --hard 选项,reset 将会在 --mixed 的基础上,让工作目录和索引保持一致(不考虑忽略文件之类)。

这里写图片描述

现在让我们回想一下刚才发生的事情:你撤销了最后的提交(git commit)、git add 和工作目录中的所有工作。

必须注意,--hard 标记是 reset 命令唯一的危险用法,它也是 Git 会真正地销毁数据的仅有的几个操作之一。其他任何形式的 reset 调用都可以轻松撤消,但是 --hard 选项不能,因为它强制覆盖了工作目录中的文件。

一个使用场景是,你发现最近一次的提交用不到了,比如需求变了,不再需要这个改动了,这时候可以使用git reset --hard HEAD~回退,运行命令后暂存区、工作区内容将会回到上次提交。接下来可以继续其他改动。注意该命令会覆盖掉工作区改动。

总结

reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:

  1. 移动 HEAD 指向的分支(若指定了--soft,则到此停止);
  2. 重置 Index 以便和 HEAD 相匹配(若未指定--hard,则到此停止);
  3. 使工作目录和索引保持一致。
posted @   Higurashi-kagome  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示