“One last commit” is the promise a developer makes when a pull request is almost done. A test is failing, a reviewer asked for a rename, the linter has an opinion. One more commit should finish it. Then CI finds something else.
It happens because each push is a new round of feedback. Continuous integration runs the full test suite, type checks and linters on every push, and the branch is only done when all of them pass. Reviewers also see the change fresh each time and may catch something new. None of that is anyone doing it wrong. It is the loop working.
A few habits shorten it. Run the same checks locally before you push: the test command, the type checker and the formatter. Read the whole CI log rather than the first red line, so you fix everything in one round. Open the pull request as a draft while you are still iterating, so reviewers are not pinged for every push.
The history can stay clean even when the loop is long. git commit --fixup <sha> marks a commit as a fix for an earlier one, and git rebase -i --autosquash folds those fixups in before review. Or let the merge method handle it: squash and merge turns the whole run of small commits into one.
It is also fine to stop for the day. A branch that is green tomorrow morning is better than one pushed at 6:40 PM with a message that says “ok really final.”
The piece says “ONE LAST COMMIT.” The proposed footnote on the back says how long ago that was.
In the wild
One last commit to fix the snapshot test, then it’s ready for another look.


