Reputation: 2473
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?
Upvotes: 107
Views: 32019
Reputation: 3608
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 stash apply 3928306034b292770cc4cd2987c034ffad250e0b
And I got my stashed changes back. Thanks to https://mobilejazz.com/blog/how-to-recover-a-deleted-git-stash/
Upvotes: 8
Reputation: 418
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
Upvotes: -1
Reputation: 1088
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:
git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk
git update-ref --create-reflog refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 -m "My recover stash"
Upvotes: 62
Reputation: 21680
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
Upvotes: 10
Reputation: 4943
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:
.rb
to match the file extension of the files you are looking for, to get appropriate syntax highlighting if you want it.| grep blob
(the blobs were where I found my files).Upvotes: 0
Reputation: 3277
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
Upvotes: 163