如何恢复Git中丢失的存储?
我经常使用git stash
和git 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