Reverting a Commit¶
Once in a while, I'll make a commit that I wish I hadn't. In many cases, the reason isn't that I don't want the change at all, but rather that it's not quite ready.
It's pretty easy to revert something while keeping your work so that you can re-commit it later, by
using a combination of branching and the
git revert command.
(Optional) Save your work¶
First, I start by saving my work using the
git branch command. Here' I'm creating a new branch
called my_saved_work, which I'll use to save the work that I will be reverting.
If you don't want to save your work, you can just skip this step and continue with reverting your commit.
$ git branch -b my_saved_work Switched to a new branch 'my_saved_work'
This branch is an exact copy of the repository as it stands now, before I begin reverting anything. Now that I have my work saved on its own branch, I'll switch back to the master branch again.
$ git checkout master Switched to branch 'master'
Revert your commit¶
Now, I'll revert the erroneous commit using
$ git revert HEAD [master e701a7a] Revert "Updated buildfile." 1 file changed, 1 insertion(+), 1 deletion(-)
This adds a new commit to your history that reverts the old one. You can check it out using
$ git log --oneline e701a7a Revert "Updated buildfile." d57f240 Updated buildfile. ...
Then, I push the new commit, which reverts the old one--it's a good thing I saved my work in a separate branch! This will make it easy to restore later...
$ git push
(Optional) Re-commit your changes¶
Since my changes have been stored on the my_saved_work branch, I can continue updating the stuff I was working on and make it perfect.
$ git checkout my_saved_work Switched to branch 'my_saved_work'
... I do some work here, commit my changes, and so forth ...
Later, once I've fixed whatever issues caused me to want to revert my change and have committed them, I'll merge the my_saved_work branch back into the master branch (or whatever branch I'm working on).
$ git checkout master Switched to branch 'master' $ git merge my_saved_work Merge made by the 'recursive' strategy. hello.py | 1 + main.py | 5 ++++- test.py | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) mode change 100644 => 100755 hello.py mode change 100644 => 100755 test.py
This merges in the original change plus all the additional changes I've made on the my_saved_work branch.
Finally, I push the updated master master branch, and I'm finished!
$ git push