Recovering From A –hard Reset In Git
I was switching between git repositories the other day, and managed to do a “git reset –hard HEAD^” in the wrong repository. Which wasn’t bad, since I had most of the files already open in Emacs… but then Emacs calmly told me that it was re-reading the files from disk.
But, git had everything still around — it turns out to be pretty easy to get it back. The magic command turned out to be git reflog.
So I had lost everything in HEAD@{1}, but you can get it back by just checking out that particular commit.
Note that if I didn’t need to fiddle around with stuff, but just had wanted everything in the commit, I could just have merged the entire commit:
… and that would have brought everything back to the state I needed.
$ git reflog aba2b93... HEAD@{0}: reset --hard HEAD^ 28a0c01... HEAD@{1}: commit: more work on pre-receive 1c4a3af... HEAD@{2}: merge tmp: Fast forward 84d69cb... HEAD@{3}: checkout: moving to commit_hooks 1c4a3af... HEAD@{4}: commit: commit hooks a489ebd... HEAD@{5}: checkout: moving to tmp a489ebd... HEAD@{6}: checkout: moving to a489ebd
$ git checkout HEAD@{1} Note: moving to "28a0c01" which isn't a local branch If you want to create a new branch from this checkout, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new_branch_name> HEAD is now at 28a0c01... commit: more work on pre-receive $ git checkout -b tmp ... do whatever you need to do to get tmp to the right state ... $ git checkout master $ git merge tmp
$ git merge HEAD@{1}