缘于某次手贱,利用git工具的时候,没注意,直接用reset hard的方式将之前提交的内容给reset掉了,这直接导致了这一部分提交的内容直接丢失。

那么怎么才能恢复这些commit呢。也找了一些教程,大致可以使用以下几种途径去处理。

git reflog

git reflog 命令读取本地的最近的操作记录,我们可以找到reset前的最后一次提交的commit 可以看到,reset操作之前提交了两次,我们选取最近的一次commit:fbcf5ad

1
git reset --hard fbcf5ad

执行上面命令后,发现又回到了最后一次提交的commit上了,也算是完美的恢复了。

对于已经commit的分支,都推荐使用这种方式恢复

git fsck –lost-found

使用该命令也可以查找到对应的悬空的commit(dangling commit),同样可以使用git reset或者git cherry-pick等命令恢复。

对于已提交的,使用该方式去恢复显然没有使用git reflog更直观

但对于未提交但已add的内容,git fsck --lost-found 也是有可能帮助恢复的。

我们通过git fsck --lost-found查看到的内容不仅能查看到悬空的commit,还能查看到悬空的blob(dangling blob), 而这些blob的内容实际就是我们未提交的内容,我们可以通过

1
git show 00bcb6e3738c7392875d6c3e65c22d569eaff069

的方式去读取到该blob对应的内容。 使用

1
git show 00bcb6e3738c7392875d6c3e65c22d569eaff069 > lost_file

的方式去将内容保存至丢失的文件中。

这样我们就可以将这些文件一个个恢复,当然过程是繁琐的。

总结

  • 尽量少使用git reset --hard 命令,一不小心可能让你头脑崩溃
  • 如果使用了该命令,却又想找回,commit过的直接使用git reflog命令找回,所以阶段性的commit是种好习惯
  • 如果未commit过的,只能使用git fsck --lost-found尝试恢复,少量的文件还是容易恢复的,但大量的文件恢复也会让你疯狂。
  • add过的文件很难恢复,所以如果有大量文件修改,最好还是阶段性的add或者commit

参考文献