git commit fixup

November 23, 2016

In this article, I will describe a git option to quickly fix a previous commit. This sometimes happens when I want to fix a typo in a previous commit after few new commits. The goal is to keep a “clean” git history with consistent commits adding features to facilitate the code reviews.

(!) Of course, like any “rewriting history” command which modifies a previous command, it should be used with caution and never used to modify a commit already push.

The options

The option is --fixup to create a commit fixing a previous one:

git commit --fixup <commit to fix>

And to automatically apply the fixup commit when rebasing, add --autosquash:

git rebase -i origin/master --autosquash

Example:

Starting with the following git history:

$git log --oneline --decorate
d36dc2f code code code
7add401 add README
fb5b59c initial commit

If you realize you did a typo in the initial README file you can fix and want to modify the ‘add README’ commit instead of creating a new commit for a typo:

${fix the typo}
$git add .
$git commit --fixup 7add401

Git has created a commit with a message prefixed with ‘!fixup’ :

$git log --oneline --decorate
7fd8071 (HEAD -> master) fixup! add README
d36dc2f code code code
7add401 add README
fb5b59c initial commit

Now, you can rewrite the git history of the 3 previous commits with:

git rebase --interactive --autosquash HEAD~3

And the result:

$git log --oneline --decorate
3ec6daa (HEAD -> master) code code code
d6c4c24 add README
fb5b59c initial commit

The --autosquash option has automatically reordered and applied the fixup commit. Note that this option only works with an interactive rebase.

Since the --autosquash option only applies to fixup commit, it is safe to enable it by default in the git config:

git config --global rebase.autosquash true

And voilĂ ! No more almost empty commits to fix typos.

source

comments powered by Disqus