How to undo git stash clear
GitGit Problem Overview
I executed git stash save "ABC"
.
Then by mistake I did git stash clear
.
How can I retrieve the data that was in stash ABC?
Git Solutions
Solution 1 - Git
As it may be found in the documentation of git stash, you may be lucky if this works:
> Recovering stashes that were cleared/dropped erroneously > > If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the following incantation to get a list of stashes that are still in your repository, but not reachable any more: > > git fsck --unreachable | > grep commit | cut -d\ -f3 | > xargs git log --merges --no-walk --grep=WIP
If you find the stash you cleared by mistake, then you can do:
git stash apply <stash>
EDIT: Use this command instead git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk --grep=WIP
Solution 2 - Git
All of the above answers end with a git stash apply [commit]
which is good, but is not an exact undo of git stash clear
. For that you need to re-stash the orphaned stash-commit. I found these instructions which almost worked but needed a flag to get all the way there. Summarizing:
- Find the orphaned stash commits:
git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk
- Re-stash the commit:
git update-ref --create-reflog refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 -m "My recover stash"
Solution 3 - Git
Run this command to find the commit:
git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk --grep=WIP
will list something like:
Checking object directories: 100% (256/256), done.
commit c36e565014d9a927c36f16e78bc327eb375d33b8
Merge: dff6bc1 4e05a0c
Author: suhailvs <[email protected]>
Date: Thu Jul 19 13:32:01 2018 +0530
WIP on master: dff6bc1 added menu
then checkout that commit c36e565014
:
git checkout c36e565014
Solution 4 - Git
I had to use
git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk
to fetch all the orphan stash which will give an o/p similar to this:
Checking object directories: 100% (256/256), done.
Checking objects: 100% (395/395), done.
commit 3928306034b292770cc4cd2987c034ffad250e0b //commit stash hash
Merge: 16056a0 ac3c354
Author: Jimmy <mail>
Date: Thu Nov 14 17:31:05 2019 +0530
On profile: stashing for
commit 50f6f3a7161dd44bfcef2b8328a2329db4c7ec34
and use
git apply stash 3928306034b292770cc4cd2987c034ffad250e0b
And I got my stashed changes back. Thanks to https://mobilejazz.com/blog/how-to-recover-a-deleted-git-stash/
Solution 5 - Git
I also deleted a stash, but using the GitKraken gui, so I don't know exactly what git commands it executed. The chosen answer didn't work for me but put me on the right path at least.
In my case, manually searching through --unreachable objects worked. I'm sure there is a more efficient way, but I'm just glad I was able to recover the changes.
ids=`git fsck --unreachable | grep blob | cut -d ' ' -f3`
number_of_ids=`echo $ids | wc -l | tr -d '[:space:]'`
for i in {1..$number_of_ids}; do git show `echo $ids | sed -n ${i}p` > evaluate$i.rb;done;
So this saves all the unreachable objects to files prefixed by "evaluate". I then opened all the files in a text editor (sublime for me subl evaluate*
), and evaluated each file in turn, manually copying and pasting the file into the old version of the original file if it was a file from the stash I deleted.
Tips:
- Change the
.rb
to match the file extension of the files you are looking for, to get appropriate syntax highlighting if you want it. - If your files aren't included, you can widen the scope of your search by removing the
| grep blob
(the blobs were where I found my files).
Solution 6 - Git
Right click on your project in project structure on the left. then select Local History --> Show History check the screen shot.it shows the list of Local Changes left side you can see the corresponding changes at right side.
To apply changes right click on the selected item it gives two options 1)Revert 2)Create Pacth