git rebase --interactive HEAD~2
# we are going to squash c into b
pick b76d157 b
pick a931ac7 c
# squash c into b
pick b76d157 b
s a931ac7 c
# after that just edit the commit message
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
git reset --soft HEAD~2 # notice this is 2, not 3
git commit --amend
From:
commit 1
commit 2
commit 3
to:
commit 1 # this will include commit 2 and commit 3
Or
git reset --soft HEAD~2
git commit --amend -C HEAD # this will automatically pick `commit 1` as the commit name
I have this in my git config:
fixup = "!f(){ git reset --soft HEAD~${1} && git commit --amend -C HEAD; };f"
And I use it as
git fixup 2 # merges the last 2 commits into their parent