Andriy Drozdyuk
Andriy Drozdyuk

Reputation: 61021

How do I undo 'git reset'?

How do I undo this command?

git reset HEAD~

Upvotes: 2044

Views: 1010390

Answers (6)

chener
chener

Reputation: 764

Answer works most time

git reset 'HEAD@{1}'

Answer works every time

git reset --hard 'HEAD@{1}'

where --hard makes everything keeps the same as before.

Upvotes: 53

Mark Lodato
Mark Lodato

Reputation: 53174

Short answer:

git reset 'HEAD@{1}'

Long answer:

Git keeps a log of all ref updates (e.g., checkout, reset, commit, merge). You can view it by typing:

git reflog

Somewhere in this list is the commit that you lost. Let's say you just typed git reset HEAD~ and want to undo it. My reflog looks like this:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

The first line says that HEAD 0 positions ago (in other words, the current position) is 3f6db14; it was obtained by resetting to HEAD~. The second line says that HEAD 1 position ago (in other words, the state before the reset) is d27924e. It was obtained by checking out a particular commit (though that's not important right now). So, to undo the reset, run git reset HEAD@{1} (or git reset d27924e).

If, on the other hand, you've run some other commands since then that update HEAD, the commit you want won't be at the top of the list, and you'll need to search through the reflog.

One final note: It may be easier to look at the reflog for the specific branch you want to un-reset, say master, rather than HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

This should have less noise it in than the general HEAD reflog.

Upvotes: 3664

Shehara Thrimavithana
Shehara Thrimavithana

Reputation: 79

  1. Use git reflog to see a list of recent commits.
  2. 2.Once you find the commit, use git reset --hard [commit-hash] or git checkout [commit-hash] to return to that specific commit.enter image description here

Ex: (git reset --hard 31511dd or git checkout 31511dd) and git push -f

Upvotes: 4

Dan
Dan

Reputation: 4159

I'll chime in with another option though.

git reset ORIG_HEAD

ORIG_HEAD references the commit that HEAD previously referenced.

Upvotes: 370

omilus
omilus

Reputation: 1286

  1. Use git reflog to get all references update.

  2. git reset <id_of_commit_to_which_you_want_restore>

Upvotes: 84

zainengineer
zainengineer

Reputation: 13889

My situation was slightly different, I did git reset HEAD~ three times.

To undo it I had to do

git reset HEAD@{3}

so you should be able to do

git reset HEAD@{N}

But if you have done git reset using

git reset HEAD~3

you will need to do

git reset HEAD@{1}

{N} represents the number of operations in reflog, as Mark pointed out in the comments.

Upvotes: 160

Related Questions