- 将多段 Git 提交合并为一条(Squash Commits)
- 一、选择合并范围
- 二、交互式 Rebase(推荐)
- 三、软重置法(快速合并)
- 四、故障排查与回滚流程图
- 五、最佳实践
- 附录:常用命令速查
将多段 Git 提交合并为一条(Squash Commits)
本文档介绍如何把一段提交历史压缩为一条干净的提交。适用于在合并分支 / 提交 PR / 发布版本前精简历史。
适用读者:日常使用 Git 的开发者
适用范围:本地分支(多人协作请先沟通,改写历史需要强制推送)
总体流程图
flowchart TD |
一、选择合并范围
查看历史,找到要合并段落中最早的那条提交(记为 commitA):
git log --oneline --decorate --graph --all |
接下来示例都以
二、交互式 Rebase(推荐)
2.1 打开交互式 rebase
git rebase -i <commitA>^ |
^ 表示从 commitA 的前一个提交开始变基,确保列表中包含 commitA。
2.2 编辑待办列表(pick / squash / fixup)
编辑器会打开从老到新的提交列表,例如:
pick <commitA> 描述 A |
将第一条保留为 pick(或改为 reword 以修改最终说明),其余全部改为 squash(合并并保留说明进行编辑)或 fixup(合并但丢弃说明):
pick <commitA> 描述 A |
想把中间说明合并整理进最终提交 → squash
想让历史更干净简短,只保留第一条说明 → fixup
2.3 编辑最终提交信息
使用了 squash 时,Git 会提示你合并并编辑 message。建议使用统一规范(如 Conventional Commits):
feat: 初始化核心模块并完善配置加载/状态更新/推理接口 |
2.4 解决冲突与继续
遇到冲突时:
# 解决冲突 |
2.5 推送(强制)
改写了历史,需要强制推送:
git push origin <分支名> --force |
三、软重置法(快速合并)
当列表很长或只想“粗暴合并”时可用:
# 回退到 commitA 的上一个,但保留工作区/暂存区 |
特点:过程短、一步到位;但不会逐条整理中间提交的说明。
四、故障排查与回滚流程图
flowchart TD |
五、最佳实践
在私有分支上频繁整理历史;提交 PR/合并前保持 1~数条语义清晰的提交。
与协作者沟通后再进行改写历史操作;推送时优先用 —force-with-lease。
善用 fixup! 工作流:
git commit --fixup=<基准SHA> |
让 Git 自动把修复提交贴到目标提交后,减少手动编辑。
使用统一提交规范(如 Conventional Commits),方便生成变更日志。
常见问题 FAQ
Q1:rebase 列表里最新的提交在最上面还是最下面?
A:一般最上面是最早,最下面是最新。如果只出现一条,检查你是否使用了
Q2:squash 和 fixup 如何选择?
A:希望整合并编辑中间信息 → squash;希望直接合并且不保留中间信息 → fixup。
Q3:强制推送有什么风险?
A:会覆盖远端历史。多人协作时建议先沟通,或使用 —force-with-lease 以避免覆盖他人最新提交。
Q4:合并后发现说明不完整怎么办?
A:使用 git commit —amend 修改最近一次提交;或通过 git reflog 回到合并前重新整理。
附录:常用命令速查
# 查看历史 |