撤消 Git reset 或 rebase 误操作,找回丢失的 commit 记录

背景

有些 Git 误操作比较致命,它会改写本地的 Git 历史记录(比如 git rebase),或者导致本地 Git 历史记录中的部分 commit 记录丢失(比如 git reset)。一旦发生这种误操作,往往会有代码丢失或提交记录错乱的风险。

解决方案

在工作目录运行以下命令:

git reflog

它会返回 HEAD 的所有变更历史,输出结果类似如下清单:

1bad68d (HEAD -> master) HEAD@{0}: reset: moving to 1bad68d
fd6fd1d HEAD@{1}: commit: do other things
f93140d HEAD@{2}: commit: do something
...

仔细观察上下文,找到你想恢复的那条记录,记下它的 commit ID(就是每条记录开头的那一串乱码,比如 fd6fd1d)。

执行以下命令(把 fd6fd1d 换成你自己的真实的 commit ID),即可恢复到那个版本:

git reset --hard fd6fd1d

检查本地的 Git 历史记录和本地文件状态,判断是否已经恢复到了想要的版本。

提示

  • 当发现已经发生误操作时,越早操作越好,越容易在 HEAD 的变更历史中找到正确的版本。
  • 在执行 git reflog 时,把完整记录保存下来。如果发现恢复的版本不对,再次尝试恢复到其他看起来正确的 commit ID 即可。
  • 不用慌,所有 commit 过的历史版本都在,只不过在当前的 Git 历史记录中看不见而已。哪怕是用最笨的办法,从最新到最早一个一个尝试 reflog 中的所有 commit ID,总是可以恢复到你想要的那个版本。
标签: Git
最后更新:2024-08-21 02:04:11