autosquash 是什么
autosquash 是交互式变基的一个开关:当提交标题以 fixup! 或 squash! 加目标提交标题开头时,git rebase -i 会把这些修补提交自动排到目标提交之后,并把指令预置成 fixup 或 squash,省去手工拖动排序。它通常与 git commit --fixup / --squash 配套使用:评审迭代期间先把补丁照常提交,通过后再一次性折叠,中间过程既不阻塞协作,又能在合并前把松散提交整理成可读的几条。所有平台通用,无额外依赖。
基本信息
| 语法 | git rebase -i --autosquash <基点> |
|---|---|
| 配套命令 | git commit --fixup / --squash <目标提交> |
| 持久化 | git config rebase.autoSquash true |
| 前提 | 目标提交必须落在变基范围内 |
| 识别依据 | 提交标题前缀 fixup! / squash! |
典型使用场景
- 给已提交内容补一个小改动(漏改、格式),又不想留一串 wip 提交
- 评审要求微调某处,先用 fixup 提交,意见落地后统一折叠
- 给不同提交分别打补丁,最后一次性归位到各自的目标提交
- 提交历史已推送,合并前把松散提交整理成可读的几条
- 多个补丁指向同一提交,把它们连续折叠成一条
- 把「忘记加文件」「改错注释」这类碎提交收干净,避免污染变更日志
完整流程
完整流程
git log --oneline -5 # 找到要补的目标提交,如 a1b2c3
git add src/login.js # 暂存需要修补的内容
git commit --fixup a1b2c3 # 生成 fixup! 开头的补丁提交
git commit --squash a1b2c3 # squash! 前缀,折叠时保留信息供编辑
git rebase -i --autosquash origin/main # todo 列表自动排好顺序
# 保存退出后补丁被折叠,历史里只剩整理过的提交fixup 与 squash 的差别
| 前缀 | 折叠动作 | 提交信息 |
|---|---|---|
| fixup! | 直接并入目标提交 | 丢弃补丁提交的信息 |
| squash! | 并入并停下来 | 打开编辑器合并两段信息 |
较新版本还支持 git commit --fixup=amend:<提交>(补正文)与 --fixup=reword:<提交>(只改标题),折叠时分别对应 amend 与 reword 指令。
把 rebase.autoSquash 设为 true 后,每次 git rebase -i 都默认带上该行为,不必反复敲 --autosquash;团队都用同一配置时,提交习惯更容易统一。
操作前后该做的事
- 折叠前先 git log --oneline 确认补丁与目标提交都在变基范围内
- 保存 todo 清单后,若出现冲突按提示解决并 --continue
- 折叠后 git log --oneline 复核结果条数与信息是否符合预期
- 已推送到共享分支时不要折叠,改写历史会给协作者制造麻烦