1. To remove a commit done locally:
You made a commit and then realized you want to remove it. But, you still want to keep your changes. This is achieved by:
$ git reset --soft HEAD^
HEAD^
means go back one commit from where HEAD is now. This will get you to the state just before the last commit.
If you do a git status
you will see that your changes are there just as they where before you staged them.
2. To remove a commit you have already pushed:
This is slightly tricky. There are safe and unsafe ways of doing this. Some of these unsafe ways involve changing the history of the repo and will create problems for other developers working with you in the same repo. I do not recommend those methods.
The safest way of removing a commit from remote is to revert the bad commit. Find the commit hash and:
$ git revert <commit-hash>
This creates a new commit that undos the changes made in the bad commit. Now push this to remote and you are good to go.
Top comments (12)
You could slightly shorten the first command with
This is especially handy when using git in powershell cli on windows, where you'd otherwise have to put 'HEAD@{1}' inside quotes.
Let's go even shorter 🤤
Yes you are right. I will update the article. Thanks.
Great post.
You could also use
git reset --hard HEAD~1
to remove the last commit, be aware that it will also remove all of your uncommitted changes.Hey It's Nice. It's very useful for me. 😁
Nice. Thanks for the tip! Very useful!
say I push some api secrets to the repo. Would the second method overwrite the commit or will,say my .env file still be accessible?
When I started out, I left my .env files out of .gitignore for the majority of a project and had to resort to starting a fresh repo. Was that necessary if the commits were already so far back in the history?
As I understand you can use interactive rebase and then push force. I used this way and I could not find later any mention of my secret word, I hope somebody corrects me if I'm wrong
PS Interactive rebase is a big topic itself, but to delete commit it's enough to write "d" or "drop" in commit line which you want to delete
Oh ok. At the time I ended up deleting the repo and copy pasting my files in with an updated .gitignore. Good to know there’s a better alternative
Thanks for this. I'm planning on having git command collection so I don't have to do a Google search each time I need to do something sinister with git. This one is handy.
I recently started using the Github desktop app and found that it has an undo button.