意外总是如期而至,如果你看到这篇文章,首先,心态不要崩。 先看这篇推荐zhuanlan.zhihu.com/p/28948567 理论上只要有足够的耐心,就能解决问题。 这里简单描述一下推荐文中提到的方法:
- git fsck --unreachable,返回结果中有commit 、blob 、tree、tag不同的类型
- git show recordId, recordId从第1步中获得,长这个样子:95ccbd927ad4cd413ee2a28014c81454f4ede82c。
- git stash apply 95ccbd927ad4cd413ee2a28014c81454f4ede82c 应用对应的stash。
提示: 实际上,不是所有的id都可以使用git stash apply xxx, 有的需要使用git merge xxx,具体如何分别,我还没研究,欢迎补充。
使用推荐文章中的方法,很可能在执行 git fsck --unreachable命令后得到茫茫多的信息。我自己遇到问题时, git fsck --unreachable | wc -l 输出了696条。在逐条**git show [记录id]**时,如果文件较长,可能还要翻页才能看到修改的地方。
很遗憾,这些记录id没有时间参数,无法按照时间筛选,也没啥可以找出的规律。如果记录较多,逐条寻找,很容易让人沮丧。 那么接下来,这里提供一个思路,具体步骤为:
- git fsck --unreachable 时可以增加筛选条件 “| grep commit”,可以提高效率
- 使用脚本工具,批量导出每一个git show [记录id] 到单独的文本文件中
- 使用常用的ide,如vscode、webstorm等,全局搜索最近修改过的关键字,尽量缩小范围。这一步骤,能够极快的找到新增的文件,修改的文件通常也能找到。
- 经过以上两步,基本上就能筛选出目标文件,如果遇到相同文件出现多次,就需要仔细对比,选择最需要的版本。
以上,相当于对推荐文章的一个补充。良好的git使用习惯,特别指出两点:
- 尽早git commit, 完成阶段成果,尽量尽早提交。因为,提交的记录更容易找回。
- 善用git stash, 如果代码质量不高,不想提交污染代码库,可以随时使用git stash 保存修改结果。每一次git stash clear 都要三思后行。