Search code examples
gitgit-stash

How to recover the index after a git stash / git stash pop?


After adding some changes to the index with git add -p, I then issued a git stash but forgot to add --keep-index. Then I stupidly did a git stash pop, and all my changes to the index were gone. Is there a way to recover the index to the state before the git stash?


Solution

  • When you've just done git stash pop, the last line in the output is:

    Dropped refs/stash@{0} (ca82a6dff817ec66f44342007202690a93763949)
    

    If you've lost it, see How to recover a dropped stash in Git? to find the commit hash.

    Once you have the hash, either:

    • Drop all current changes (applied stash):

      git reset --hard

      And reapply the stash using its id, this time with index:

      git stash apply ca82a6d --index

    • Reset only the index, the point here is that the index is saved as a second parent of the stash:

      git reset ca82a6d^2 .

      Notice the dot at the end. If you don't specify it, it'll also move HEAD to the index (the index will appear as a commit). In this case run git reset --soft HEAD@{1} to return the HEAD to its previous position.