How can I merge multiple commits onto another branch as a single squashed commit? How can I merge multiple commits onto another branch as a single squashed commit? git git

How can I merge multiple commits onto another branch as a single squashed commit?


Say your bug fix branch is called bugfix and you want to merge it into master:

git checkout mastergit merge --squash bugfixgit 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 maingit merge --squash feature

is the equivalent of doing:

git checkout featuregit diff main > feature.patchgit checkout mainpatch -p1 < feature.patchgit 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 feature1git rebase -i master

Squash into one commit then repeat for the other features.

git checkout mastergit merge feature1 feature2 feature3 ...

That last merge is an "octopus merge" because it's merging a lot of branches at once.

Hope this helps