两步恢复丢失的 Git 暂存区
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
有时你会暂时存放 一些代码,然后这些存放的代码会在某个时候被清理掉。有一天,你可能会遇到我这周遇到的情况:
好了,这段代码已经合并了,现在我们删除相关的代码仓库。搞定!等等……这部分功能不是应该已经合并到代码库里了吗?我刚才删除的代码仓库是不是就此丢失了?
幸运的是,我成功找回了丢失的暂存区。我不是 Git 专家,但以下是我在阅读各种资料(包括一些 Stack Overflow 上的 回答)后总结出的有效方法。
以下是两步恢复程序。
1. 列出丢失的藏匿点
让我们对一个所有暂存区都被删除的项目运行此命令:
git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk
- 要退出藏匿点列表,请按Q 键。
- 要在长长的收藏列表中导航,请使用
up箭头down键。 - 对于 Windows 用户来说,johnwait 的评论或许能在战斗中对你有所帮助。
2. 将丢失的物品寄回原处
让我们使用第二个暂存区的提交哈希值:
git update-ref refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 -m "My recovered stash"
就是这样!你可以像往常一样,使用 `git stash` 命令或在你最喜欢的 Git 客户端git stash list中查看你的代码库。
陷阱
1. 我仍然看不到我找回的藏匿处。
请使用--create-reflog参数重试(感谢studoggithub):
git update-ref refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 --create-reflog -m "My recovered stash"
2. 我的 Git 不是英文的
alias git='LANG=en_GB git'如果你的 Git 不是英文的,那么每次你想恢复一组暂存时,你都必须运行命令(感谢mathieuschopfer)。
一些建议
提交信息是健康的
始终使用提交消息git stash save -m "My commit message":如果没有消息,唯一有助于识别暂存的信息就是它的时间戳和保存它的分支,这与一个强而明确的名称相比可能不够。
提交信息也有助于 Git 客户端:
- 我使用的 Git 客户端 GitUp 完全无法显示未命名的暂存区。这大概就是为什么在 GitUp 中创建暂存区时必须给它命名的原因吧,这真是太棒了!
- 知名的SourceTree能够成功显示未命名的资源库,但正如你所料,该列表浏览起来并不友好:

是的,git stash apply>git stash pop
与 不同git stash pop,git stash apply不会从藏匿点列表中删除藏匿点,这可以避免一些损失。
分支 > 藏匿处
最后,我建议避免使用 `stash`。git stash相反,尽量使用分支。这看似显而易见,但我是在寻找恢复暂存区的方法时才想到的:也许我应该使用临时分支而不是暂存区。在工作中使用Git Flow方法时,我本应该在遇到痛苦的经历之前就想到这一点。
如果您有任何藏匿毒品的技巧或经验想要分享,欢迎留言。
文章来源:https://dev.to/meduzen/recover-a-lost-git-stash-in-two-steps-569
