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

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

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


当前回答

我喜欢亚里士多德的方法,但不喜欢使用GITK。。。因为我习惯于从命令行使用GIT。

相反,我接受了悬空提交,并将代码输出到DIFF文件,以便在代码编辑器中查看。

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

现在,您可以将生成的diff.txt文件(位于主文件夹中)加载到txt编辑器中,并查看实际代码和生成的SHA。

那就用

git stash apply ad38abbf76e26c803b27a6079348192d32f52219

其他回答

我无法在一个简单的命令窗口(在我的例子中是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 log --oneline --all --grep="^WIP on .*: [a-f0-9]\+" --grep="^On [^ ]*:" --grep="^index on [^ ]*:" $( env LANG=C git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

这是基于亚里斯多德·帕加尔茨的回答。

在git v2.6.4的OSX中,我只是意外地运行了git stash drop,然后我通过以下步骤找到了它

若你们知道储藏物的名称,那个么使用:

$git fsck--无法访问|grep commit |cut-c 20-|xargs git show |grep-B 6-A 2<存储的名称>

否则,您将通过以下方式手动从结果中找到ID:

$git fsck--无法访问|grep commit |cut-c 20-|xargs git show

然后,当您找到提交id时,只需点击git stash apply{commit id}

希望这能帮助到某人

亚里士多德接受的答案将显示所有可到达的提交,包括非隐藏类提交。要过滤掉噪声:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3

这将只包括只有3个父提交的提交(一个存储库将有),并且其消息包含“WIP on”。

请记住,如果您用消息保存了您的存储(例如git存储保存“我新创建的存储”),这将覆盖默认的“WIP on…”消息。

您可以显示有关每次提交的更多信息,例如显示提交消息,或将其传递给git stash show:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
  git log -1 --format=medium --color=always '{}'; echo; \
  git stash show --color=always '{}'; echo; echo" | \
less -R

为什么人们会问这个问题?因为他们还不知道或不了解回流。

这个问题的大多数答案都给出了长命令和选项,几乎没有人会记得。因此,人们进入这个问题,复制粘贴他们认为需要的任何内容,然后几乎立即忘记。

我建议每个有这个问题的人只检查一下reflog(git reflog),不要太多。一旦您看到所有提交的列表,就有一百种方法可以找到您要查找的提交,并从中选择或创建分支。在此过程中,您将了解reflog以及各种基本git命令的有用选项。