我经常使用gitstash和gitstashpop来保存和恢复工作树中的更改。昨天,我在我的工作树中做了一些修改,这些修改是我藏起来并弹出的,然后我对工作树做了更多的修改。我想回去回顾一下昨天隐藏的更改,但gitstashpop似乎删除了对相关提交的所有引用。

我知道如果我使用git stash,那么.git/refs/stash包含用于创建stash的提交的引用。git/logs/refs/stash包含整个存储。但这些参考资料在git stash pop之后就不见了。我知道提交仍在我的存储库中,但我不知道它是什么。

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


当前回答

我想在已接受的解决方案中添加另一个好方法,以在您没有gitk可用或没有X输出时完成所有更改。

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

for h in `cat tmp_commits`; do git show $h | less; done

然后,您将获得这些哈希值的所有差异。按“q”进入下一个差异。

其他回答

我只是想在公认的解决方案中提及这一点。第一次尝试这个方法时,我并没有立即意识到这一点(也许应该是这样),但要从哈希值应用存储,只需使用“git stash apply”:

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

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

通过以下步骤恢复:

识别已删除的隐藏哈希代码:gitk--all$(git fsck--no reflog | awk‘/悬空提交/{print$3}‘)樱桃摘葡萄:git cherry pick-m 1$stash_hash_code使用以下方法解决冲突(如果有):git合并工具

此外,如果使用gerrit,您可能会遇到提交消息的问题。在执行下一个备选方案之前,请先保存您的更改:

使用硬重置到上一次提交,然后重新提交此更改。你也可以把零钱藏起来,重新放在底座上,然后重新提交。

通过在终端中写入此命令,可以列出所有无法访问的提交-

git fsck --unreachable

检查无法访问的提交哈希-

git show hash

如果你找到了隐藏的物品,最后申请-

git stash apply hash

我无法在一个简单的命令窗口(在我的例子中是Windows7)中获得在Windows上工作的任何答案。awk、grep和Select字符串未被识别为命令。所以我尝试了一种不同的方法:

第一次运行:git fsck--无法访问| findstr“commit”将输出复制到记事本查找用start cmd/k git show替换“无法访问的提交”

将看起来像这样:

启动cmd/k git show 8506d235f935b92df65d58e7d75e9441220537a4启动cmd/k git show 44078733e1b36962571019126243782421fcd8ae启动cmd/k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1启动cmd/k git show d00aab9198e8b81d052d90720165e48b287c302e

保存为.bat文件并运行它脚本将打开一组命令窗口,显示每个提交如果你找到了你要找的,运行:git stash apply(你的哈希)

也许不是最好的解决方案,但对我来说有效

如果您没有关闭终端,只需查看git stash pop的输出,您将获得丢弃的stash的对象ID。通常情况如下:

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

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

要取回存储,只需运行gitbranchtmp2cae03e,就可以将其作为一个分支获取。要将其转换为存储,请运行:

git stash apply tmp
git stash

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