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

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

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


当前回答

知道了大概的文件名及其位置,并且能够找到丢弃的隐藏文件,并将悬空提交添加到路径中

for i in $(git fsck --no-reflogs | awk '/dangling commit/ {print $3}'); do
  if git log -5 --name-only -u $i | grep -q "<path-to-files>/.*<partial-file-name>.*"; then
    echo "found something in commit $i";
  fi;
done

其他回答

要获取仍在存储库中但无法访问的存储列表,请执行以下操作:

git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP

如果您给了存储的标题,请将命令末尾的-grep=WIP中的“WIP”替换为消息的一部分,例如-grep=Tesselation。

该命令是“WIP”的grepping,因为存储的默认提交消息的格式为mybranch上的WIP:[先前提交哈希]先前提交的消息。

找到提交后,使用git stash apply<commit_hash>应用它

您可以一步一步地执行以下过程:

1-使用下面列出所有无法访问的提交git fsck—无法访问

2-显示无法访问的提交哈希git显示哈希

3-复制所有日志,您可以看到类似日志的、无法访问的blob、提交和树。

4-使用具有提交哈希的日志应用git stashgit stash apply[替换哈希]

知道了大概的文件名及其位置,并且能够找到丢弃的隐藏文件,并将悬空提交添加到路径中

for i in $(git fsck --no-reflogs | awk '/dangling commit/ {print $3}'); do
  if git log -5 --name-only -u $i | grep -q "<path-to-files>/.*<partial-file-name>.*"; then
    echo "found something in commit $i";
  fi;
done

我想在已接受的解决方案中添加另一个好方法,以在您没有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 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}

希望这能帮助到某人