How do I undo this command?
git reset HEAD~
--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 git reset 'HEAD@{1}'
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
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 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 fatal: ambiguous argument ''HEAD@{1}'': unknown revision or path not in the working tree.
Resolved by omitting the quotation marks around HEAD@{1}
. - anyone 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
git reset ORIG_HEAD
? Thanks. - anyone 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
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 Use git reflog
to get all references update.
git reset <id_of_commit_to_which_you_want_restore>
Answered 2023-09-21 08:08:22
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