When working with Git one important rule is to try to keep your commit history clean, avoiding to write pointless commit message such as "WIP", "TODO", etc...
But sometimes people can do honest mistakes, or they can code away, commit many times with small changes, and then perhaps you want to cleanup your commit history and group your changes under one commit.
Using the reset command
One way to do it is by resetting your commit history, so for example you have two commits, and you want to squash them in one, you can do this:
# Reset the history reverting back to the past 2 commits
git reset --mixed HEAD~2
Now you will see that the code you changed in the past two commits is again ready to be commited again.
# Stage all the files
git add -A
# Commit the staged files
git commit -m "Your message"
Now to rewrite the history on the remote, you will have push with the --force
flag to apply those changes to the remote.
git push --force origin <YOUR-BRANCH-NAME>
And now your history is clean as nothing ever happened :-)
Using the rebase command
Another way to do it is by using the rebase strategy:
# this lets you interactively select commits
git rebase -i HEAD~2
Then select the commits you want to squash by setting s
instead of pick
, after that save with whatever editor your are using, and edit the commit message.
And as before you will have to override history with this:
git push --force origin <YOUR-BRANCH-NAME>
This is a much quicker way and it has the advantage of letting you pick which commmits to squash, but the disadvantage is that using rebase could be problematic if you don't know exactly what are you doing, and I would recommend to read this link.
Top comments (0)