首页/开发/Git 与协作速查/git rebase --autosquash 自动折叠修复提交
合并变基与冲突71 条

git rebase --autosquash 自动折叠修复提交

与 git commit --fixup/--squash 配合:交互式变基时把 fixup!、squash! 前缀的提交自动排到目标提交之后并标记折叠。

Git 与协作速查开发更新于 2026-10-13

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 复核结果条数与信息是否符合预期
  • 已推送到共享分支时不要折叠,改写历史会给协作者制造麻烦

易错点

  • 目标提交不在变基范围内时不会被折叠,基点必须覆盖到目标提交所在的区段
  • 自动排序靠提交标题匹配,若目标提交标题后来被改写过,前缀对不上就会排不进 todo 清单,保存前务必核对
  • 折叠会改写历史,已推送的分支需要配合强推,先确认该分支是个人分支再操作
  • squash! 折叠时会打开编辑器合并信息,若中途直接退出可能得到一段含糊的提交说明,建议提前想好最终标题

数据来源与参考

  • Git 官方文档:git-rebase(--autosquash)
  • Git 官方文档:git-commit(--fixup/--squash)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌