撤消意外的git stash pop

nre*_*ren 178 git git-stash

在进行复杂的合并之前,我隐藏了一些本地更改,进行了合并,然后在运行之前愚蠢忘了提交git stash pop.流行音乐创建了一些问题(在大代码库中调用错误的方法),这些问题很难被追踪.我跑了git stash show,所以我至少知道哪些文件被更改了.如果没有别的,我想这是一个承诺更多的教训.

我的问题:是否有可能撤消存储流行而不撤消合并?

Ben*_*son 67

尝试使用如何在Git中恢复被删除的存储?找到你弹出的藏匿处.我认为存储总是有两个提交,因为它保留了索引和工作副本(所以索引提交通常都是空的).然后git show他们看到差异并使用patch -R取消应用它们.

  • 哇有效.我能够用`git fsck --no-reflog |找到存储提交 awk'/ dangling commit/{print $ 3}'`(来自链接),我只是从那个差异手动找到了问题.谢谢! (6认同)
  • @ meson10:不幸的是,stashes保存在reflog中,这将是显而易见的方式(如果它们是真正的分支)来查看弹出的stashes的历史.另外,让我建议一个downvote +请求帮助不是最好的策略. (4认同)
  • 我花了一些时间才把它弄对。这是我的工作结果:`git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | 补丁 -R -p1`; 我按照建议尝试使用 `git show`,但它的输出不适合补丁;我还必须提供 `-p1` 选项来修补以去除 `git diff` 放在文件前面的 `a/..` 和 `b/..` 元素,否则它不会解析路径从存储库根目录。建议:在使用补丁之前要小心并在单独的分支中提交混乱。 (2认同)

kac*_*har 35

git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP
Run Code Online (Sandbox Code Playgroud)

这对我来说比同样情景下的接受答案更好.

  • 请注意,许多涉及搜索"WIP"的解决方案都依赖于默认的存储消息.如果您向您的stashes显示明确的消息,他们可能不包含WIP. (13认同)