Apr 18 2009
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.
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
So I had lost everything in HEAD@{1}, but you can get it back by just checking out that particular commit.
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
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
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.