This post was originally published on my blog.
Today my co-worker asked me how to revert to an old and good commit on master ( after you accidentally merged
dev branch to
There are many ways to do that, for example we can use
reset to discard all wrong commit to revert back, like
undo when writing text.
You can find others way on
this topic on Stack Overflow
But the problem is too many options, we dont know which one is good, or even dont need to understand - it just works.
So i will introduce you my traditional way and extremely accurate.
First of all, after you did a
merge you should not delete commit with
git reset (Undo) thus we want to repair it instead of delete it.
Next, in general, between any two
commit in you git repository is a different line of codes, which you can always see wit the git
Revert an old commit is to delete these different.
Suppose we are in
master branch and we want to revert back to commit
So you first need to
clone/checkout master branch to a new clean folder ( the directory where you type
git status -u and you see nothing there.)
$ git status -u # make sure it is clean $ git checkout master # be sure you are in master $ git diff HEAD..8398e5b > patch.diff
In the last command, the order is very important.
commit we want to revert to must be in the end.
Then you apply this diff
$ patch -p1 < patch.diff $ git status -u
Check if any new files have not been commited in the result of
git status -u above, these are the files included in the old commit 8398e5b:
$ git add some/new/files.txt $ git commit -m "Revert to 8398e5b, thanks to @kn"
To be sure, check the results:
$ git diff 8398e5b..
This time it should appear ... nothing, that is, you have completely restored your old commit. 🎉🎉🎉
This way is always successful, simple, you can even take advantage of a few things to adjust.
And above all, instead of having to understand a bunch of commands like
git reset,... you just focus on understanding the problem of diff, diff, and diff