How do I undo 'git reset'?

Asked 2023-09-21 08:08:22 View 663,655

How do I undo this command?

git reset HEAD~
  • If anyone is looking for how to undo a hard reset, check in Undoing a git reset --hard HEAD~1. The solutions are very similar. - anyone
  • Possible duplicate of How can I undo git reset --hard HEAD~1? - anyone
  • It’s not a duplicate of the questions related to --hard! The risk of accidentally running this command is much higher. For instance, you want to unstage a single file with git reset foo-file. You only write the first part of the filename, hit tab for autocompletion, it actually completes to a branch name, you don’t notice it and run the command git reset foo-branch instead. Voilà - anyone

Answers

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.

Answered   2023-09-21 08:08:22

  • As a more visual and nicer alternative to reflog for this purpose, I like to use git log --graph --decorate --oneline $(git rev-list -g --all). It shows a tree of all commits, including dangling unnamed branches - anyone
  • Lets say I have a directory with existing files in it. In this directory I run git init, and then right after that git reset --hard. There is no reflog, or even any logs to begin with. Are these files pretty much toast now? - anyone
  • git reset HEAD~12 oops... git reset HEAD@{12} nooo .. 'git reflog' to the rescue! oh it's just git reset HEAD@{1} - anyone
  • Trying out the "short answer" (copy & paste), I got the following error: fatal: ambiguous argument ''HEAD@{1}'': unknown revision or path not in the working tree. Resolved by omitting the quotation marks around HEAD@{1}. - anyone
  • works for undoing git reset --soft HEAD~1, and after running git reset 'HEAD@{1}', the stage area is clean too. - anyone

Old question, and the posted answers work great. I'll chime in with another option though.

git reset ORIG_HEAD

ORIG_HEAD references the commit that HEAD previously referenced.

Answered   2023-09-21 08:08:22

  • This seems great – would you be able to elaborate? Is "ORIG" here short for "original" or for "origin"? … Ie, does it reset to where HEAD was before starting to monkey with it? Or to where HEAD is on the origin? What happens if you've moved HEAD several times before the git reset ORIG_HEAD? Thanks. - anyone
  • ORIG stands for original, ORIG_HEAD means original HEAD, before the reset - anyone
  • "Certain operations, such as merge and reset, record the previous version of HEAD in ORIG_HEAD just prior to adjusting it to a new value. You can use ORIG_HEAD to recover or revert to the previous state or to make a comparison." Excerpt from book: "Version Control with Git" - anyone
  • Note HEAD@{1} is always previous value of HEAD while ORIG_HEAD is the previous value of HEAD after select commands. - anyone

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.

Answered   2023-09-21 08:08:22

  • accepted option does not provide example of going forward N I was in a situation an hour ago where I wanted to forward more than 1. Tried with multiple and it worked. Wanted to add that here. Will be useful for people looking for undo reset with git reset HEAD~3 - anyone
  • but if some one has done git reset HEAD~3 he can quickly see how to to undo it, git reset HEAD@{3} is required without going into reflog git reset HEAD~3 etc is a common situation - anyone
  • I think anybody seeing {1} / {2} would realise that the number could be any revision number, which the reflog command provides you with. Agreed that your point about the numbers being the same for either direction ~3 / @{3} but didn't really need to be a new answer. - anyone
  1. Use git reflog to get all references update.

  2. git reset <id_of_commit_to_which_you_want_restore>

Answered   2023-09-21 08:08:22

  • THIS! You just saved me my man! - anyone

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.

Answered   2023-09-21 08:08:22