在使用 的过程中,不可避免地需要使用 操作,也不可避免地出现 误操作的情况。

reset 有 soft/mixed/keep/hard 四种模式,前三种就不说了,误操作的时候一般都比较容易找回,下面就来说说 hard 这种方式的 reset 该如何找回本地提交的记录和文件。

git reset --hard XXX 是一种强硬的文件和提交一起回退的 reset 方式,并且会自动保存,让你无论从 git log 或者文件历史记录里都无法找到 reset 分支之后的记录,堪称一绝。

不过如果误操作了也不用怕(比如 reset 到了更早的分支,导致正在使用的代码丢失),git 还给我们准备了一粒后悔药,那就是 reflog

当使用 git reset --hard XXX 重置到了错误的分支之后,使用 git reflog 命令可以看到分支的操作记录:

huang@LAPTOP-46T99JS6 MINGW64 ~/Workspace/IdeaProjects/.com/huangzhongzhang/ (master)
$ git reflog show master | head -5
7883c94 master@{0}: rebase finished: refs/heads/master onto 7883c941693aa88a51d3ecb462ef88183863c8f2
2331833 master@{1}: reset: moving to 2331833fc4072c11d88df2c203a704d370709333
b49b5dc master@{2}: commit: 默认去除二维码的邮箱发送功能,建议使用本地扫描的方式,避免不必要的配置。
11b9816 master@{3}: commit: 添加自动重启脚本。
7883c94 master@{4}: clone: from https://.com/huangzhongzhang/NPC.git

可以看到,我在提交了 b49b5dc 版本的记录后,有过一次 reset 操作,而正是这次 reset 操作,使我本地的两次提交记录都丢失了。

找到操作记录后,我们只需再执行一次 reset,即可还原到我们所需要的分支:

huang@LAPTOP-46T99JS6 MINGW64 ~/Workspace/IdeaProjects/github.com/huangzhongzhang/NPC (master)
$ git reset --hard master@{2}
HEAD is now at b49b5dc 默认去除二维码的邮箱发送功能,建议使用本地扫描的方式,避免不必要的配置。

关于 git resetgit reflog 的更多资料请参考:
http://www.worldhello.net/gotgit/02-git-solo/040-git-reset.html