Rebasing

Rebasing is named after the practice of taking commits from one point in history and replaying them atop another, allowing related commits to remain grouped together whilst also including changes made outside of its history.

--autosquash

Assume you made a commit containing a typo or a lint error:

$ echo '# Tyopgraphy' >README.md
$ git add README.md
$ git commit -m Boilerplate
[master (root-commit) b72086d] Boilerplate
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Maybe we've done some other work in the middle and it's impractical now to commit --amend, we can instead create a fixup commit:

$ git commit --fixup b72086d
[master ea70229] fixup! Boilerplate
 1 file changed, 1 insertion(+), 1 deletion(-)

Post-review, we can squash this:

git rebase -i --root --autosquash

Which will result in a rebase planned as follows:

pick b72086d Boilerplate
fixup ea70229 fixup! Boilerplate

--autostash

--autostash will automatically stash save and stash pop before and after rebases, reducing friction.