Git 重置

Git 重置

git reset 命令是 Git 最危险最容易误用的命令之一!一定要慎用,要清除地知道你自己在做什么!

Git reset 命令格式

git reset [--soft | --mixed | --hard] [<commit>]

Git 提交历史记录

cat .git/refs/heads/master 显示的就是当前版本库的最新commitid

Git 重置与版本变化关系图

上述图,

  • 1 代表更新引用指向,即引用指向新的 commit
  • 2 代表暂存区的内容与版本库保持一致
  • 3 代表工作区的内容与暂存区保持一致

使用不同的参数,执行的操作不一样:

  • --hard 参数,上图 1、2、3 这三步全部执行
  • --soft 参数,上图 1 执行
  • --mixed 参数,上图 1、2 执行
  • 不使用参数,等同于使用了 --mixed 参数

根据上述解释,我们来看几个例子:

彻底回退到上一次提交

git reset --hard HEAD^

HEAD^ 指:HEAD 的父提交,即上一次提交。注意 --hard 选项会将本地工作区的内容也恢复为上一次提交,且不可恢复,所以此命令慎用!!!

彻底回退到某一次 commit

根据 commit id 回退到某一次的提交:

git reset --hard 9e8a761

9e8a761 代表完整 commit id 的前 6 位,一般前 6 位就可以定位出一次 commit 了。

将文件改动撤出暂存区

git reset
# 或
git reset HEAD
# 或
git reset -- fileName
# 或
git reset HEAD fileName

上述命令,相当于对 git add 命令的反向操作,其可以撤出所有 add 进暂存区的文件,也可以单独针对某个 fileName 文件做出撤出。

撤出后,你对这个文件的改动依然保留在本地,只不过这个文件没有 add 进暂存区而已,没有什么损失。

软回退到上一次提交

git reset --soft HEAD^

工作区和暂存区保持不变,但是引用向前回退一次。当对最新提交的修改、或者提交的修改说明不满意的时候,可以使用这个命令撤销最新的提交,以便重新提交。

工作中常用的 git commit --amend 命令(用于对最新的提交修改或提交说明进行修改,以便重新进行提交)就是相当于执行了下面两条命令:

git reset --soft HEAD^
git commit -e -F .git/COMMIT_EDITMSG

如何恢复 reset

在执行 reset 之前,一定要使用 git log 记录好最近的几次 commitId 记录,当出现问题的时候,还可以恢复到指定的 commitId 提交上。

不过如果之前忘记记录的话,也可以通过查看 cat .git/logs/HEAD 日志文件内容,来找到有关 commit id 的记录。

Git 本身也提供了 git reflog 命令,来查看日志信息:

git reflog show master

参考

扫描下面二维码,在手机端阅读: