Not quite sure what's happened, but git stash seems to be in a bad place.
% git stash list stash@{0}: filter-branch: rewrite stash@{1}: filter-branch: rewrite stash@{2}: On mysolr: start mysolr stuff
Is OK, and git show stash@{0}
works fine. But:
% git stash drop '' is not a stash reference % git stash pop '' is not a stash reference % git stash drop stash@{0} 'stash@{0}' is not a stash reference
I've used git stash plenty in the past and not come across this. I had recently rewritten history to remove a file from history before publishing to github. The command I ran then was
git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch FILENAME' \ --prune-empty --tag-name-filter cat -- --all
Any ideas how to fix the stash?
If the argument to git stash does not sufficiently resemble a stash bag, you get that not a stash reference complaint. Note that git show stashref uses plain old git show , which does not require that a commit given as an argument resemble a stash.
use git stash push -m aNameForYourStash to save it. Then use git stash list to learn the index of the stash that you want to apply. Then use git stash pop --index 0 to pop the stash and apply it.
Git Stash List. The Git stash list command will pull up a list of your repository's stashes. Git will display all of your stashes and a corresponding stash index. Now, if you wish to view the contents of a specific stash, you can run the Git stash show command followed by stash@ and the desired index.
To retrieve changes out of the stash and apply them to the current branch you're on, you have two options: git stash apply STASH-NAME applies the changes and leaves a copy in the stash. git stash pop STASH-NAME applies the changes and removes the files from the stash.
I think filter-branch
has broken your stashes. If the argument to git stash
does not sufficiently resemble a stash bag, you get that not a stash reference
complaint.
Note that git show stashref
uses plain old git show
, which does not require that a commit given as an argument resemble a stash. If git stash show
fails the same way as the other git stash
commands, or if manual examination of the stash in question shows that it's no longer a two- or three-parent merge commit, then this is in fact the case.
It was likely the --prune-empty
that did it here. If you had not add
ed anything at the time of the stash, the index commits would be empty. In general it's probably wiser to avoid filtering stash refs.
You can try two different approaches:
refs/original/
(where filter-branch
left them) and/or reflogs; use those to rebuild refs/stash
and/or the stash reflogs, or use them directly and then clobber the stash ref and its reflog.git show
command you've already run.(For a bit more on stash and stash bags, including the three-parent form used with --all
or --untracked
, see How to recover from “git stash save --all”?.)
Assuming you have gotten your contents back and wish to wipe out the stash
reference entirely, this will do it. Note that this is the "nuke it from orbit" option—don't do it until you're sure you're ready:
git update-ref -d refs/stash
You don’t have to nuke all of your stashes. You can delete just the broken ones manually using git reflog
. In your case:
git reflog delete --rewrite stash@{1} git reflog delete --rewrite stash@{0}
(I put these in reverse order here because every deletion decreases the numbering of the following entries. In practice, don’t bother doing the math mentally, just do git stash list
after every deletion to get an updated list and pick another remaining broken entry from that.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With