recommit 用于重塑一个分支在其目标分支之上的提交序列,让每个提交只讲一件事、能独立成立,同时保持原始分支尖端(tip)提交树完全不变。它改写的是提交历史,不编辑代码本身,也不是用来改变功能行为的。
适用场景:整理功能分支上杂乱的提交,把重构、独立修复和功能拆分为可分别审阅的提交,保留生成文件(如 lockfile、翻译、快照)与需要它们的变更在一起。
必要用法:要求使用具名分支且 Git 可见工作区干净,用 git branch --show-current 和 git status --porcelain=v1 --untracked-files=all 检查;根据 PR/MR 元数据或 origin/HEAD 确定目标分支,记录 git rev-parse HEAD、HEAD^{tree} 和 git merge-base <TARGET_REF> HEAD 得到 ORIG、ORIG_TREE、MERGE_BASE,仅改写 MERGE_BASE..ORIG 范围。完成设计后用 git reset --hard <ORIG> 作为恢复点,并按 REBUILD.md 的方法重建历史。
验证:用 test "<ORIG_TREE>" = "$(git rev-parse HEAD^{tree})" 确认最终树不变,用 git status --porcelain=v1 --untracked-files=all 确认工作区干净,再在临时工作树对每个提交运行计划中的检查;失败时用 git reset --hard <ORIG> 恢复。
限制:不要用它改变行为,不要改写目标分支已包含的提交,也不要在他人基于其构建且未协调的分支上使用。工作树不干净时,可提示用户用 git commit --fixup=<sha> 或已安装的 git absorb 生成 fixup! 提交。详细重建步骤需读取 REBUILD.md。