Interactive example · from Shipping Software with Git + Claude Code
The wall of diff
Good session: the retry logic, the config rename, and the new export flag all work. Commit it.
Three hours of work, three unrelated changes, currently one big pile in the working tree.
Pick the agent's next move, then see where it leads:
The retry logic is looping forever in production. Revert it.
The revert takes the config rename and the export flag with it: they're welded into the same commit. I'll have to revert all three, then re-apply two of them by hand from the old diff. Twenty minutes of surgery for what should have been one command.
One commit, three purposes: revert stops being surgical, bisect stops being useful, and the 23-file diff was never really reviewable in the first place.
The retry logic is looping forever in production. Revert it.
git revert a1b2c3d: done, retry gone, rename and flag untouched. And for next time: the redo branch starts from a clean history where the retry change is one readable diff.
Three purposes, three commits: the bad one reverts in one command, the good ones stand, and each diff was small enough to actually read at review time.
Done: 23 commits. Caveat I should flag: the retry change spans 6 of them, so commits 4 through 9 each leave the build broken until the next lands.
So bisect lands on a broken-by-construction commit, and reverting the retry means finding six needles.
Granularity by file, not by purpose: every commit is small and none is coherent. The unit of a commit is the change that stands together: builds green, reverts whole.