Git is an excellent tool to safely develop applications with total control of our source code. It can be used to track changes, collaborate with others and save your work in remote in servers that GitHub or Bitbucket offer us. But all people have bad days and mistakes can occur at any moment. Luckily, Git implements some mechanisms to fix all those commits that you pushed with a wrong identity, really bad messages or you just want to remove them forever.
If your commit is local and you didn’t push it
You can git commit --amend
to change the message and the author of the commit or just go to Commit options… on the right bottom side and click Amend latest commit.
If your commit is already pushed
You can still use the same commands, but you will need to force push the commit using git push --force example-branch
. For SourceTree, you can follow exactly the same steps, but you have to take into account that you still need force push this. SourceTree is very cautious with this as the force option is by default deactivated. If you want to enable it, you need to go to options/preferences and look for Enable Force Push:
After that, when you click in the Push button, you will see the Force Push option in the bottom of the window:
Please, use --force
carefully as this will rewrite your remote history with the changes you have in your local environment, if you are the only working in the repository it’s OK, but if you are sharing it with more people, you can potentially delete some commits pushed by others.
If you have multiple commits already pushed and you want to keep the changes
In this case rebase is your friend. You can use git rebase -i HEAD~n
where n is the number of commits you want to amend. Git will open your commit messages in your text editor:
Below the commits, you will have a list of commands you can use. Add the command you want to use (edit in our case) and save the file. After that, you will need to amend every commit you are editing:
$ git commit --amend --author="John Doe <johndoe@example.com>"
$ git rebase --continue
Once you finish, don’t forget to git push --force example-branch
.
For SourceTree, you can right click to the commit you want to rebase:
A new window should open and there you can select what commits you want to amend:
If you have multiple commits already pushed and you don’t mind about the changes
To delete all the commits you don’t want to hold anymore you need to perform a hard reset. You still can do a soft reset and keep your the changes in your working tree if you want to commit them again with some changes, but I’d prefer the rebase way as it will give you more control committing the changes in the way that were originally pushed. So to reset the branch you can:
$ git reset --hard HEAD~n
$ git push --force example-branch
Using SourceTree, you can just click on to the commit you want to reset:
And then, you have to force push to update your remote repository.
Hi! My name is Alejandro and I’m Technical Lead (Full-Stack). I’m really interested on new technologies and programming skills. I also participated in some gaming development competitions. I hope you enjoy this blog! 😉