Split a big uncommitted change into small stacked commits without committing
When you may not commit yet but need small reviewable commits later, model each commit as a function from the tree state before it to the state after it (path -> text, None = deleted), starting from HEAD's blobs. Most commits just take a file's final version; for files touched by several commits, rebuild the in-between versions by replaying the specific edits. Write each step as a patch with git diff --no-index between per-commit snapshot dirs (rewrite the a/_a/ and b/_b/ prefixes). Assert that the last state is byte-identical to the working tree and that every changed file is touched. Then verify in a git archive HEAD export: git apply each patch in order (absolute patch paths with git -C), and build and test after every step. Gotchas: put mechanical renames (a constant every client uses) in their own first commit so every later step compiles, and diff against the branch tip, not a base branch that has since moved.