Fixing commits with git commit --fixup and git rebase --autosquash

The way I like to make changes in response to a PR review is to make any fixes to the original commits using a rebase. I don't want commits that "fix typos" in my history, especially at the feature branch level. There are varying opinions and approaches to this, but I think rebasing is great tool when used on your own branches and in moderation.

Standard procedure for this is - 1) Make the code change; 2) Commit the change; 3) Start an interactive rebase; 4) Identify the commit that needs fixing; 5) Move the new commit underneath it; 6) Change it to "squash". It's quite tedious.

Fixup commits

Fixup commits are created using git commit --fixup <SHA>. Practically, --fixup associates a new commit with an existing commit so that when you do an interactive rebase, you don't have to re-order any commits in order to squash them. And you don't have to change any commit messages. From the docs:

Construct a commit message for use with rebase --autosquash.

--autosquash?

--autosquash is a flag to use with rebase and takes everything a step further. Once you've committed your changes with git commit --fixup <SHA> you can start an interactive rebase as normal, but pass the --autosquash flag too.

1
git rebase -i --autosquash master

Now you won't have to do anything, the rebase will automatically take care of squashing those commits created with --fixup in the correct order!

You can have this behaviour by default, which seems safe and sensible, by setting autosquash = true in your ~/.gitconfig.

1
2
[rebase]
  autosquash = true

Automating further

I use --fixup so much that I have a helper alias in my ~/.gitconfig.

1
2
[alias]
  fixup = "!git log -n 50 --pretty=format:'%h %s' --no-merges | fzf | cut -c -7 | xargs -o git commit --fixup"

This lets me type git fixup and presents a list of my 50 most recent commits and allows me to search the list using fzf. Once a commit is selected, the SHA is passed to git commit --fixup.

It works like this:

I hope this makes your commit fixing easier!