撤消 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,总是可以恢复到你想要的那个版本。