我经常使用gitstash和gitstashpop来保存和恢复工作树中的更改。昨天,我在我的工作树中做了一些修改,这些修改是我藏起来并弹出的,然后我对工作树做了更多的修改。我想回去回顾一下昨天隐藏的更改,但gitstashpop似乎删除了对相关提交的所有引用。
我知道如果我使用git stash,那么.git/refs/stash包含用于创建stash的提交的引用。git/logs/refs/stash包含整个存储。但这些参考资料在git stash pop之后就不见了。我知道提交仍在我的存储库中,但我不知道它是什么。
有没有一种简单的方法可以恢复昨天的存储提交引用?
我最喜欢的是这一行:
git log --oneline $( git fsck --no-reflogs | awk '/dangling commit/ {print $3}' )
这与这个答案基本相同,但要短得多。当然,您仍然可以添加--graph以获得树状显示。
在列表中找到提交后,使用
git stash apply THE_COMMIT_HASH_FOUND
对我来说,使用--no reflogs确实揭示了丢失的存储条目,但--unareachable(正如许多其他答案中所发现的)并没有。
在Windows下,在gitbash上运行它。
致谢:以上命令的详细信息摘自https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf
要获取仍在存储库中但无法访问的存储列表,请执行以下操作:
git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP
如果您给了存储的标题,请将命令末尾的-grep=WIP中的“WIP”替换为消息的一部分,例如-grep=Tesselation。
该命令是“WIP”的grepping,因为存储的默认提交消息的格式为mybranch上的WIP:[先前提交哈希]先前提交的消息。
找到提交后,使用git stash apply<commit_hash>应用它