如何恢复丢弃的 git stash 数据

意外总是如期而至,如果你看到这篇文章,首先,心态不要崩。
先看这篇推荐https://zhuanlan.zhihu.com/p/28948567,理论上只要有足够的耐心,就能解决问题。
这里简单描述一下推荐文中提到的方法:
1、git fsck --unreachable,返回结果中有commit 、blob 、tree、tag不同的类型
2、git show recordId, recordId从第1步中获得,长这个样子:95ccbd927ad4cd413ee2a28014c81454f4ede82c。
3、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没有时间参数,无法按照时间筛选,也没啥可以找出的规律。如果记录较多,逐条寻找,很容易让人沮丧。
那么接下来,这里提供一个思路,具体步骤为:
0、git fsck --unreachable 时可以增加筛选条件 “| grep commit”,可以提高效率
1、使用脚本工具,批量导出每一个git show [记录id] 到单独的文本文件中
2、使用常用的ide,如vscode、webstorm等,全局搜索最近修改过的关键字,尽量缩小范围。这一步骤,能够极快的找到新增的文件,修改的文件通常也能找到。
3、经过以上两步,基本上就能筛选出目标文件,如果遇到相同文件出现多次,就需要仔细对比,选择最需要的版本。

以上,相当于对推荐文章的一个补充。
良好的git使用习惯,特别指出两点:
1、尽早git commit, 完成阶段成果,尽量尽早提交。因为,提交的记录更容易找回。
2、善用git stash, 如果代码质量不高,不想提交污染代码库,可以随时使用git stash 保存修改结果。每一次git stash clear 都要三思后行。

推荐阅读更多精彩内容