Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Is it possible to undo a git reset?
For some reason, I just wanted to undo a commit on my git repository, which I've done with the following command:
git reset --soft HEAD~1
So far, so good. However, by mistake I issued the command a second time, thus deleting also an earlier commit. It also turned out that I had forgotten to push that change.
Now I do have a backup of the previous state, but that's on an external disk that's at a different place than me currently.
Now the change itself was pretty trivial (and of course is still contained in the collective changes in the working directory; indeed I could just re-apply it by checking in one file), but of course all the metadata is gone (in particular, the change date).
Now I'd like to not wait until I have access to the hard disk with the backup again, but I'd also like not to lose that metadata in the repo.
Does git have the possibility to restore the deleted update somehow? The mistaken reset currently is the last thing done on the repo.
If not, is it possible to just commit new stuff (that includes that change), and then later re-insert that version in the version history from the backup, so that afterwards it looks as if the commit had never been deleted?
2 answers
If you've committed, then the commit is in the git repo regardless. All git reset
does is change what commit the HEAD
references. If you find the hash corresponding to the commit you'd like HEAD
to reference, you could just git reset --soft <commit hash>
.
git log --reflog
should list all the commits to HEAD
including the ones that were reset. I believe this is reading the relevant file in .git/logs/refs/heads
which you can also look at and may be a bit clearer.
Creating a repository, making two commits, and doing a git reset --soft HEAD^
once leads to the following output:
$ git log
commit 4a96a4d58f0755652e8fe007798f9d72b0541cc8 (HEAD -> master)
Author: Derek Elkins
Date: Fri Jun 3 14:22:32 2022 -0700
1
$ git log --reflog
commit e9a9e5b57da67b88bb55a02728e90b0cd91ff158
Author: Derek Elkins
Date: Fri Jun 3 14:22:47 2022 -0700
2
commit 4a96a4d58f0755652e8fe007798f9d72b0541cc8 (HEAD -> master)
Author: Derek Elkins
Date: Fri Jun 3 14:22:32 2022 -0700
1
$ cat .git/logs/refs/heads/master
0000000000000000000000000000000000000000 4a96a4d58f0755652e8fe007798f9d72b0541cc8 Derek Elkins 1654291352 -0700 commit (initial): 1
4a96a4d58f0755652e8fe007798f9d72b0541cc8 e9a9e5b57da67b88bb55a02728e90b0cd91ff158 Derek Elkins 1654291367 -0700 commit: 2
e9a9e5b57da67b88bb55a02728e90b0cd91ff158 4a96a4d58f0755652e8fe007798f9d72b0541cc8 Derek Elkins 1654291373 -0700 reset: moving to HEAD^
"reset" copies the old head to
.git/ORIG_HEAD
To restore that commit, you can run
$ git reset ORIG_HEAD
If you want to restore more than one reset, then you'll have to look for the commit id. If you already know it, you can just do
$ git reset <commit>
If you don't, then you can use git reflog
to try to find that earlier commit. (kudos here)
For anyone who wants to take the opportunity to change something before reapplying the commit, the Git documentation has a section specifically titled Undo a commit and redo. You can run
$ git commit -a -c ORIG_HEAD
Note that this only works to restore one commit
0 comment threads