我意外地执行了两次git stash pop
,使我的一个存储位置落后于我想要的位置。如何撤消最后一次弹出?我确实想要第一支,但不想要第二支,所以reset --hard HEAD
不会为我做。
"撤消"git stash pop
有点痛苦,除非您在某个地方列出了存储的原始提交ID(例如,在屏幕上)。
git stash
文档(在末尾)给出了恢复丢失的存储的指示。这些是您想要的说明,因为pop
只是"apply
,然后是drop
"。这意味着,如果您恢复了两个存储,那么您可以使用git reset --hard
来恢复所有内容,git stash pop
(或者更安全的是,因为它不会"丢弃"git stash apply
)您想要使用的一个存储,然后验证所有内容。
如果你能找到并恢复这两个藏匿处,我可能会这么做。
如果你能找到第二个存储(你想"取消应用"的),你可以尝试反向应用它
以下是文档中的"咒语":
git fsck --unreachable | grep commit | cut -d -f3 | xargs git log --merges --no-walk --grep=WIP
运行此程序时,您将获得一个提交列表,该列表表示每个"存储包"的每个w
提交。比方说它会抛出这样的东西:
Checking object directories: 100% (256/256), done.
Checking objects: 100% (66/66), done.
commit 2783bc8cf98192acc3de647d6cbff2c1a2aecca5
Merge: 222c4dd 8466342
Author: ...
Date: Wed Feb 12 17:38:13 2014 -0700
WIP on branch: 222c4dd add clobber-reg example
commit e9fc3cc8e7864813b54bb1281c845297a16b1b47
Merge: 222c4dd d790e1f
Author: ...
Date: Wed Feb 12 17:28:00 2014 -0700
WIP on branch: 222c4dd add clobber-reg example
date
行在这里很有用,因为这是制作隐藏的时间。很难区分这两个藏匿处,不是吗?将原始SHA-1 ID保存在某个位置,并在每个ID上运行git stash show -p
。当你发现一个有价值的东西时,给它一个名字:
$ git tag recover-exp-1 e9fc3cc8e7864813b54bb1281c845297a16b1b47
$ git tag recover-exp-2 ...
一旦你确定了哪些是正确的恢复的,你就可以开始做git reset --hard
和git stash apply
之类的事情了。您现在可以通过上面的标签名称进行申请:
$ git reset --hard # ouch, all gone now (maybe "git stash save" first)
$ git stash apply recover-exp-3 # that turned out to be the right one
当所有内容都以您想要的方式保存并提交时,您可以删除各种"恢复"标记。(注意,你可以使用任何你喜欢的名字;recover-exp-
没有什么特别的,这只是我在这里编的。)
我不相信你能轻易地撤消最后一次弹出。如果第一次流行音乐中有你需要的东西,你可能只需要在这一点上处理冲突。
将来,如果你想避免这样的问题,你可以在本地分支机构上提交,而不是使用隐藏。它更笨重,但更有弹性。