如何把多个提交压缩成一个合并到目标分支(Squash Merge)

把多个提交压成一个合入目标分支:切到目标分支执行 git merge --squash <源分支>,再 git commit 写一条总括信息即可。GitHub 的 Squash and merge 按钮同理。源分支后续应删除避免重复冲突。

最佳实践
Git 提交历史与版本恢复示意

最简单的方式是 git merge --squash:切到目标分支,执行 git merge --squash feature-x——源分支的全部改动会合并进暂存区但不产生合并提交,你写一条总括的提交信息 git commit 即可。功能分支的几十个 WIP 提交在主分支上只留下一条干净记录。

操作步骤

git checkout main
git merge --squash feature-x        # 改动进暂存区,不自动提交
git commit -m "实现支付功能:支持微信/支付宝渠道"

GitHub 等价操作

PR 页面选 Squash and merge:所有提交压缩成一条进主分支,提交信息可编辑。团队可以在仓库 Settings 里强制只许 squash merge,保持主分支历史干净。

squash 后源分支的处理

git branch -D feature-x             # 需要 -D(它的提交"形式上"未合并)
git push origin --delete feature-x

squash 合并后源分支的原始提交并不在 main 的祖先链上,继续在上面开发后再合并会产生重复改动冲突——squash 之后源分支应该废弃。

常见问题(FAQ)

Q:merge --squash 和 squash and merge 有区别吗?

同一操作的命令行与网页版。命令行版不产生合并提交(历史完全线性);GitHub 的按钮同样产生单提交。

Q:想保留提交明细又想要整洁历史怎么办?

在 feature 分支上先 git rebase -i 整理(squash 掉 fixup 类小提交、保留有意义的节点),再普通 merge——兼顾整洁与细节。

Q:squash 合并后还能找回原始提交吗?

源分支删除前,git reflog 或原分支引用还在就都在。不要把 PR 页面当作原始提交永久保留的承诺,需要长期保留时应建立分支或标签引用。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台