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

标签 git recovery git-stash

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

我知道如果我使用git stash,那么.git/refs/stash包含用于创建存储的提交的引用。 .git/logs/refs/stash 包含整个存储。但这些引用在 git stash pop 后就消失了。我知道该提交仍在我的存储库中的某个地方,但我不知道它是什么。

是否有一种简单的方法来恢复昨天的存储提交引用?

最佳答案

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

git stash apply $stash_hash

或者,您可以使用以下命令为其创建一个单独的分支

git branch recovered $stash_hash

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

查找哈希

如果您刚刚 pop 它并且终端仍然打开,您将 still have the hash value printed by git stash pop on screen(谢谢,Dolda)。

否则,您可以使用适用于 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}' )

...如果使用 Windows 版 PowerShell,请参阅 the answer from emragins

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

如果您更喜欢控制台上的漂亮图表而不是单独的 GUI 应用程序,则可以将其中的 gitk 替换为 git log --graph --oneline --decorate 之类的内容.

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

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

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

关于git - 如何恢复 Git 中丢失的存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857178/

相关文章:

Github |为什么当我推送到特定分支时没有记录在我的贡献中

linux - 如何在测试服务器上创建 git 存储库的虚拟副本

git - 我应该推送已编译的 javascript 还是忽略它们?

java - 恢复损坏的 java 文件

git - git stash 命令后文件状态丢失

git - 有没有办法输出之前的git分支名?

gitolite:允许任何 repo RW+CD 的 RW 用户到他们的个人分支,不允许其他人

testing - 从 E2E 自动化的逻辑点重试失败的自动化测试用例

design-patterns - 具有检查点和恢复的事务服务的设计模式

git - 为什么每个分支的 git stash 不是唯一的?