如何恢复丢弃的 git stash 数据

407 阅读2分钟

意外总是如期而至,如果你看到这篇文章,首先,心态不要崩。 先看这篇推荐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没有时间参数,无法按照时间筛选,也没啥可以找出的规律。如果记录较多,逐条寻找,很容易让人沮丧。 那么接下来,这里提供一个思路,具体步骤为:

  1. git fsck --unreachable 时可以增加筛选条件 “| grep commit”,可以提高效率
  2. 使用脚本工具,批量导出每一个git show [记录id] 到单独的文本文件中
  3. 使用常用的ide,如vscode、webstorm等,全局搜索最近修改过的关键字,尽量缩小范围。这一步骤,能够极快的找到新增的文件,修改的文件通常也能找到。
  4. 经过以上两步,基本上就能筛选出目标文件,如果遇到相同文件出现多次,就需要仔细对比,选择最需要的版本。

以上,相当于对推荐文章的一个补充。良好的git使用习惯,特别指出两点:

  1. 尽早git commit, 完成阶段成果,尽量尽早提交。因为,提交的记录更容易找回。
  2. 善用git stash, 如果代码质量不高,不想提交污染代码库,可以随时使用git stash 保存修改结果。每一次git stash clear 都要三思后行。