如何在 git stash / git stash pop 后恢复索引?

15

在使用 git add -p 命令向索引中添加更改后,我执行了 git stash 命令,但忘记使用 --keep-index 参数。然后我愚蠢地执行了 git stash pop 命令,导致所有对索引的更改都消失了。有没有办法将索引恢复到执行 git stash 命令之前的状态?


通常情况下,Stashing 会将索引和工作目录中的更改分别保存,因此弹出存储应该会恢复索引? - poke
@poke 不幸的是,索引被 git stash 清空了,在 git stash pop 之后仍然保持清空状态。也许如果我使用了 git stash pop --index 命令,它就会被恢复,但我没有这样做 :/ - Watcom
@poke 第一部分正确,第二部分不正确。必须在 git stash apply|pop 后添加 --index 参数。 - maliayas
2个回答

10
当你刚刚执行了 git stash pop 命令后,输出中的最后一行是:
Dropped refs/stash@{0} (ca82a6dff817ec66f44342007202690a93763949)

如果您丢失了stash,请参考如何在Git中恢复丢失的stash?以找到提交哈希。
一旦您获得了哈希值,请选择:
  • 放弃当前所有更改(应用stash):

    git reset --hard

    然后使用其id重新应用stash,这次包括索引:

    git stash apply ca82a6d --index

  • 仅重置索引,这里的重点是索引作为stash的第二个父项被保存:

    git reset ca82a6d^2 .

    注意末尾的点号。如果您不指定它,它也会将HEAD移动到索引处(索引将显示为提交)。在这种情况下,运行git reset --soft HEAD@{1}将HEAD返回到其上一个位置。


7
这将完成任务:
git stash apply --index

编辑:考虑到索引已经丢失,你应该运行 git fsck --unreachable 命令并检查它返回的最新提交。你必须能够在那里看到你丢失的索引。然后你可以使用 git cherry-pick 命令。


1
不错!Stashes确实保留了索引和工作目录的单独状态。我之前并不知道这一点。 - Maic López Sáenz
1
这也适用于 "pop":git stash pop --index - Shadow Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接