Squash commits in Git
Nov 4, 2019 00:00 · 277 words · 2 minutes read
Often I can see following pattern: I worked hardly on implementing new feature, committed many small changes and when the feature is ready, I would like to have one solid commitment. Commits squashing helps me to get required result. So… how to do it? Let’s see example:
Well, let’s see my commits history:
$> git log --oneline
0b6a22b (HEAD -> master) Added unit tests
0bde9e4 Example, example, example
dd2b136 Added design info
9d50b03 Small change 2
b50dff9 Small change 1
f26798f Initial commit
I would like to squash 5 latest commits (b50dff9 … 0b6a22b). I can do it with interactive git rebase
in format git rebase -i HEAD~<N>
or git rebase -i <last-requred-commit>
. In my case, I have to do following command:
$> git rebase -i HEAD~5
or
$> git rebase -i f26798f
Git should open editor with following content:
pick b50dff9 Small change 1
pick 9d50b03 Small change 2
pick dd2b136 Added design info
pick 0bde9e4 Example, example, example
pick 0b6a22b Added unit tests
What I should do - just first commit as p(ick) and all other commits as s(quash):
p b50dff9 Small change 1
s 9d50b03 Small change 2
s dd2b136 Added design info
s 0bde9e4 Example, example, example
s 0b6a22b Added unit tests
Save, quit from the editor and… git should open editor again with a proposed message for new commit. I am replacing the message with simple “Prepared pre-release” and again - save, quit from the editor.
Voilà! We have squashed commits.
$> git log --oneline
811b769 (HEAD -> master) Prepared pre-release
f26798f Initial commit
For more information about git rebase click here
Also read about Squash and merge from Github click here