如何把多个提交压缩成一个合并到目标分支(Squash Merge)
把多个提交压成一个合入目标分支:切到目标分支执行 git merge --squash <源分支>,再 git commit 写一条总括信息即可。GitHub 的 Squash and merge 按钮同理。源分支后续应删除避免重复冲突。
最简单的方式是 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 页面当作原始提交永久保留的承诺,需要长期保留时应建立分支或标签引用。