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

我经常使用git stashgit stash pop来保存和恢复工作树中的更改。 昨天我在我的工作树上发生了一些变化,我把它藏起来并弹出,然后我对工作树做了更多的修改。 我想回顾一下,查看昨天隐藏的更改,但git stash pop似乎删除了对相关提交的所有引用。

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

有没有简单的方法来恢复昨天的隐藏提交参考?

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


如果你只弹出它并且终端仍然打开,你仍然可以在屏幕上用git stash pop打印散列值(谢谢Dolda)。

否则,你可以在Linux和Unix上使用它找到它:

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

和Windows:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $bits = $_ -split ' '; echo $bits[2];}

这将向您显示提交图的提示中的所有提交,这些提交不再从任何分支或标记引用 - 每次丢失的提交(包括您创建的每个提交提交)都将位于该图的某处。

找到你想要的隐藏提交最简单的方法可能是将该列表传递给gitk

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

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

如果你喜欢在单独的GUI应用程序上的控制台上的一个很好的图形,你可以用git log --graph --oneline --decorate来代替那里的gitk

要发现隐藏提交,请查找此窗体的提交消息:

WIP on somebranch:commithash一些旧的提交消息

注意:如果您在执行git stash时未提供消息,则提交消息将仅以此格式(以“WIP on”开头)。

一旦你知道你想要的提交的散列,你可以将它作为一个存储:

git stash apply $stash_hash

或者你可以使用gitk的上下文菜单来创建你感兴趣的任何无法访问的提交的分支。之后,你可以用所有普通工具对它们进行任何你想做的事情。 当你完成后,再把这些树枝吹走。


如果你没有关闭终端,只要看看git stash pop的输出,你就会得到被丢弃的stash的对象ID。 它通常看起来像这样:

$ git stash pop
[...]
Dropped refs/stash@{0} (2ca03e22256be97f9e40f08e6d6773c7d41dbfd1)

(注意, git stash drop也会产生相同的行。)

为了得到这个存储,只需运行git branch tmp 2cae03e ,你就可以将它作为一个分支。 要将其转换为存储,请运行:

git stash apply tmp
git stash

把它作为一个分支也可以让你自由地操纵它; 例如,挑选它或合并它。


只是想提一下这个被接受的解决方案。 当我第一次尝试这个方法时(可能它应该是这样),对我来说并不是很明显,但是要从散列值中应用存储,只需使用“git stash apply”即可:

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

当我刚接触git时,这并不清楚,我尝试了不同的“git show”,“git apply”,“patch”等组合。

链接地址: http://www.djcxy.com/p/4011.html

上一篇: How to recover a dropped stash in Git?

下一篇: How can I undo git reset