不小心跑了两次git藏匿pop



我意外地执行了两次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 --hardgit 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-没有什么特别的,这只是我在这里编的。)

我不相信你能轻易地撤消最后一次弹出。如果第一次流行音乐中有你需要的东西,你可能只需要在这一点上处理冲突。

将来,如果你想避免这样的问题,你可以在本地分支机构上提交,而不是使用隐藏。它更笨重,但更有弹性。

最新更新