petrhurtak.com site logopetrhurtak.com

Squash commits

When you create merge request often you will want to squash all the commits into one.

If you search Google about how to squash all commits, you will often find confusing tutorials that will either recommend using git rebase (where you have to manually specify which commits you want to squash), or tutorials recommending using git reset or git rebase on latest n commits (where you need to know how many commits you made in your branch). But there is an easier way.

One liner solution

git reset $(git merge-base origin/master $(git rev-parse --abbrev-ref HEAD))

What happens

git rev-parse --abbrev-ref HEAD

Gets current name of the branch, eg.: branch-name

git merge-base origin/master my-branch

Git merge-base finds best common ancestor between two commits to use in a three-way merge, eg.: c111855daca0d1834cc836dc65ea39d22dabf14c.

After this command you will end up in the state where your branch will be identical to origin/master and all the changes you made on your branch will be unstaged. So all you need to do is add the changes to staging, create squashed commit and force push to your branch.

git add .
git commit -m "commit message"
git push --force

That's it.

TLDR

Replace origin/master with the branch against you are merging.

git reset $(git merge-base origin/master $(git rev-parse --abbrev-ref HEAD))
git add .
git commit -m "commit message"
git push --force