How to use git merge --squash?
Say your bug fix branch is called bugfix
and you want to merge it into master
:
git checkout master
git merge --squash bugfix
git commit
This will take all the commits from the bugfix
branch, squash them into 1 commit, and merge it with your master
branch.
Explanation:
git checkout master
Switches to your master
branch.
git merge --squash bugfix
Takes all commits from the bugfix
branch and groups it for a 1 commit with your current branch.
(no merge commit appears; you could resolve conflicts manually before following commit)
git commit
Creates a single commit from the merged changes.
Omitting the -m
parameter lets you modify a draft commit message containing every message from your squashed commits before finalizing your commit.
What finally cleared this up for me was a comment showing that:
git checkout main
git merge --squash feature
is the equivalent of doing:
git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .
When I want to merge a feature branch with 105(!!) commits and have them all squashed into one, I don't want to git rebase -i origin/master
because I need to separately resolve merge conflicts for each of the intermediate commits (or at least the ones which git can't figure out itself). Using git merge --squash
gets me the result I want, of a single commit for merging an entire feature branch. And, I only need to do at most one manual conflict resolution.
You want to merge with the squash option. That's if you want to do it one branch at a time.
git merge --squash feature1
If you want to merge all the branches at the same time as single commits, then first rebase interactively and squash each feature then octopus merge:
git checkout feature1
git rebase -i master
Squash into one commit then repeat for the other features.
git checkout master
git merge feature1 feature2 feature3 ...
That last merge is an "octopus merge" because it's merging a lot of branches at once.
Hope this helps