发布于 2026-01-06 0 阅读
0

两步恢复丢失的 Git stash DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

两步恢复丢失的 Git 暂存区

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

有时你会暂时存放 一些代码,然后这些存放的代码会在某个时候被清理掉。有一天,你可能会遇到我这周遇到的情况:

好了,这段代码已经合并了,现在我们删除相关的代码仓库。搞定!等等……这部分功能不是应该已经合并到代码库里了吗?我刚才删除的代码仓库是不是就此丢失了?

幸运的是,我成功找回了丢失的暂存区。我不是 Git 专家,但以下是我在阅读各种资料(包括一些 Stack Overflow 上的 回答)后总结出的有效方法。

以下是两步恢复程序。

1. 列出丢失的藏匿点

让我们对一个所有暂存区都被删除的项目运行此命令:

git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk
Enter fullscreen mode Exit fullscreen mode

它会返回一个按日期排序的丢失物品​​列表。
嚯,3个丢失的藏匿点!

  • 要退出藏匿点列表,请按Q 键
  • 要在长长的收藏列表中导航,请使用up箭头down键。
  • 对于 Windows 用户来说,johnwait 的评论或许能在战斗中对你有所帮助。

2. 将丢失的物品寄回原处

让我们使用第二个暂存区的提交哈希值:

git update-ref refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 -m "My recovered stash"
Enter fullscreen mode Exit fullscreen mode

就是这样!你可以像往常一样,使用 `git stash` 命令或在你最喜欢的 Git 客户端git stash list中查看你的代码库

陷阱

1. 我仍然看不到我找回的藏匿处。

请使用--create-reflog参数重试(感谢studoggithub):

git update-ref refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 --create-reflog -m "My recovered stash"
Enter fullscreen mode Exit fullscreen mode

2. 我的 Git 不是英文的

alias git='LANG=en_GB git'如果你的 Git 不是英文的,那么每次你想恢复一组暂存时,你都必须运行命令(感谢mathieuschopfer)。

一些建议

提交信息是健康的

始终使用提交消息git stash save -m "My commit message":如果没有消息,唯一有助于识别暂存的信息就是它的时间戳和保存它的分支,这与一个强而明确的名称相比可能不够。

提交信息也有助于 Git 客户端:

  • 我使用的 Git 客户端 GitUp 完全无法显示未命名的暂存区。这大概就是为什么在 GitUp 中创建暂存区时必须给它命名的原因吧,这真是太棒了!
  • 知名的SourceTree能够成功显示未命名的资源库,但正如你所料,该列表浏览起来并不友好:SourceTree 中的未命名存储点

是的,git stash apply>git stash pop

与 不同git stash popgit stash apply不会从藏匿点列表中删除藏匿点,这可以避免一些损失。

分支 > 藏匿处

最后,我建议避免使用 `stash`。git stash相反,尽量使用分支。这看似显而易见,但我是在寻找恢复暂存区的方法时才想到的:也许我应该使用临时分支而不是暂存区。在工作中使用Git Flow方法时,我本应该在遇到痛苦的经历之前就想到这一点。

如果您有任何藏匿毒品的技巧或经验想要分享,欢迎留言。

文章来源:https://dev.to/meduzen/recover-a-lost-git-stash-in-two-steps-569