撤消意外的git stash pop


186

在进行复杂的合并之前,我进行了一些本地更改,进行了合并,然后在运行之前愚蠢地忘记了提交git stash pop。流行音乐产生了一些问题(在大型代码库中调用错误的方法),这些问题很难找到答案。我运行了git stash show,所以我至少知道哪些文件已更改。如果没有别的,我想这是一个多奉献的教训。

我的问题:是否可以在不取消合并的情况下撤消隐藏弹出消息?


2
不应该先git stash pop提交就不允许您这样做。您是怎么做到的?
克里斯·杰斯特·杨

不确定是否诚实(昨天)。合并不是单独提交的,因为存在冲突。在那之后,我以某种方式能够运行隐藏存储。
nren 2011年

1
我只是使用git版本1.7.9.msysgit.0做到了这一点。我不分阶段的文件,并藏匿在弹出刚刚合并的一切。
PandaWood

git stash pop在使用2.25.0.windows.1版本的git进行更改(我没有提交)后,我能够运行
Artem Hevorhian

如果您索引更改并stash pop/apply在提交前运行时丢失了更改,则可以解雇git fsck --lost-found。此命令将遍历暂存但未提交到任何地方(因此悬空)的悬空Blob(不熟悉git术语的用户的实际文件),并将其放在.git / lost-found /目录下,您可以在git show其中查看它们如果这些是您要查找的文件。
Artem Hevorhian

Answers:


69

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


6
哇,行得通。我能够git fsck --no-reflog | awk '/dangling commit/ {print $3}'(通过链接)找到隐藏提交,而我只是从该差异中手动找到了问题。谢谢!
nren 2011年

1
fsck输出大量列表。git显示那里的每个SHA1都很繁琐。你怎么做到这一点 ?
meson10

5
@ meson10:不幸的是,藏匿处被保存在reflog中,这是查看弹出藏匿处的历史的明显方法(如果它们是真正的分支)。还让我建议,反对投票+寻求帮助不是最佳策略。
本杰克逊

2
我花了点力气才把它弄对了。这是我的工作的结果:git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1; 我git show按照建议尝试了,但是它的输出不适合打补丁。另外,我还必须提供-p1修补程序的选项,以剥离放置在文件前面的a/..and b/..元素,git diff否则它将无法解析来自存储库根目录的路径。建议:在打补丁之前,请谨慎行事并在单独的分支中提交混乱。
basilikode

@BenJackson在您的回答中,“总是”表示两者stash popstash push会触发提交,该提交会将更改保存到索引和工作目录中,对吗?
Artem Hevorhian

36

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

在相同情况下,这比公认的答案更好。


13
请注意,许多涉及搜索“ WIP”的解决方案都依赖于默认的隐藏消息。如果您为存储项提供显式消息,则它们可能不包含WIP。
本杰克逊

谢谢。我在log命令中添加了--oneline选项,以提高可读性。
basslo

这仅有助于您找到隐藏提交的SHA。但是,如果将其与@basilikode注释中的注释(git diff SHA〜1 SHA |补丁-R)集成在一起,则可以正常工作。我建议先使用路径--dry-run进行检查。
Jarek C

3

如果您的合并不太复杂,则另一种选择是:

  1. 使用“ git stash”将所有更改(包括合并更改)移回存储
  2. 再次运行合并并提交您的更改(不包含已存储的更改)
  3. 运行一个“ git stash pop”,它应该忽略您先前合并的所有更改,因为这些文件现在完全相同。

此后,您只剩下隐藏的更改而已,您放弃得太早了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.