一尘不染

如何在 Git 中恢复丢失的存储?

javascript

我经常使用git stashandgit stash pop来保存和恢复工作树中的更改。昨天我在我的工作树中进行了一些更改,我已经隐藏并弹出了这些更改,然后我对我的工作树进行了更多更改。我想回去查看昨天隐藏的更改,但git stash pop似乎删除了对相关提交的所有引用。

我知道如果我使用git stash然后.git/refs/stash 包含用于创建存储的提交的引用。并且.git/logs/refs/stash包含整个存储。但是那些参考文献都没有了git stash pop。我知道提交仍在我的存储库中的某个地方,但我不知道它是什么。

有没有一种简单的方法可以恢复昨天的存储提交参考?

请注意,今天这对我来说并不重要,因为我每天都有备份,并且可以返回到昨天的工作树来获取我的更改。我问是因为必须有更简单的方法!


阅读 243

收藏
2022-02-11

共1个答案

一尘不染

一旦您知道您删除的存储提交的哈希值,您就可以将其应用为存储:

git stash apply $stash_hash

或者,您可以为它创建一个单独的分支

git branch recovered $stash_hash

之后,您可以使用所有常规工具做任何您想做的事情。完成后,只需将树枝吹走。

查找哈希

如果你刚刚弹出它并且终端仍然打开,你仍然会在屏幕上打印哈希值git stash pop

否则,您可以在 Linux、Unix 或 Windows 的 Git Bash 上使用它:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

…或使用适用于 Windows 的 Powershell:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $_.ToString().Split(" ")[2] }

这将在提交图的提示处向您显示不再从任何分支或标签引用的所有提交——每个丢失的提交,包括您曾经创建的每个存储提交,都将在该图中的某个位置。

找到您想要的存储提交的最简单方法可能是将该列表传递给gitk

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

这将启动一个存储库浏览器,向您显示存储库中的每一次提交,无论它是否可访问。

如果您更喜欢控制台上的漂亮图形而不是单独的 GUI 应用程序,则可以将其替换gitk为类似的东西。git log --graph --oneline --decorate

要发现 stash 提交,请查找以下形式的提交消息:

​ 在某个分支上的 WIP :commithash一些旧的提交消息

注意:如果您在提供消息时没有提供消息,则提交消息只会采用这种形式(以“WIP on”开头)git stash

2022-02-11