Rebasing in Git
Sometimes a feature branch contains a bunch of random commits with even more random commit messages. In order to make things clearer in the git history and aid others in deciphering what the feature branch is really doing, it is necessary to “sqaush” these little commit messages into 1 commit with a more succinct description of the branch’s changes.
Squashing a commit
In order to do this you can perform an interactive rebase
.
Command:
$ git rebase -i Head~n
The command above lets you rebase n
commits on your branch. If you want to
squash all the commits from the merge-base
or the commit where it branched off
of master
, or whatever parent branch your branch came from, you can use this
command:
$ git merge-base name_of_branch name_of_parent_branch
This should spit out a giant hash like:
1881e40a619f809d8eaf475dc52769fb9901366d
Using this hash, you can then rebase ALL commits on your feature branch using:
$ git rebase -i 1881e40a619f809d8eaf475dc52769fb9901366d
This will bring up a text editor in your terminal with all the commits on the branch:
pick 1fc6c95 do something
pick 6b2481b do something else
pick dd1475d changed some things
pick c619268 fixing typos
These commits are ordered from oldest to newest (newest on the bottom). You can
use a number of commands in place of the pick
command. To squash a commit and
meld it into the previous one (the one on top of it), just replace pick
with
squash
or s
for short.
pick 1fc6c95 do something
s 6b2481b do something else
s dd1475d changed some things
s c619268 fixing typos
This will squash the 3 newest commits into the 1st and original commit. Saving the file will then bring up a new editor Allowing you to reword a commit message that will be used for the squashed commit. This is cool because you can work on a branch and commit whenever it pleases you, making random commit messages. At the end you can squash them all together into a clean and understandable commit message that others will be able to interpret without pulling their hairs out.
Resources
How to Rebase a Pull Request · edx/edx-platform Wiki · GitHub
Git Interactive Rebase, Squash, Amend and Other Ways of Rewriting History