Menu
CoddyTech

Git:压缩提交(Squash)

最后更新

压缩(squash)就是把几个提交合成一个,让“wip”“fix typo”“actually fix it”这样一串杂乱的提交变成一个干净的提交。常用的工具是交互式变基 git rebase -i,在里面标记要合并在一起的提交。由于压缩会改写历史,请在推送之前做,或者只在你一个人使用的分支上做。

在终端在线编辑器中试试这些命令:浏览器里就是真正的 shell,无需安装。

压缩提交(squash)通过交互式 rebase 把一串小提交合成一个干净的提交。

语法

命令作用
git rebase -i HEAD~3交互式变基最近 3 个提交
git rebase -i main变基 main 之后的所有提交
git merge --squash feature合并时把分支的所有提交压缩成一个
git reset --soft HEAD~3 && git commit不用变基,压缩最近 3 个提交

交互式变基命令

在打开的编辑器中,把 pick 改成下面的某个关键字。

关键字作用
pick原样保留该提交
squash (s)并入上一个提交,合并提交信息
fixup (f)并入上一个提交,但丢弃本提交的信息
reword (r)保留该提交,但修改提交信息

完整示例

推送之前,把最近三个提交压缩成一个。

步骤操作结果
1git rebase -i HEAD~3在编辑器中打开最近 3 个提交
2把第 2 和第 3 个提交改为 squash标记它们并入第一个提交
3保存并编辑合并后的提交信息三个提交变成一个干净的提交

Git 压缩提交常见问题

压缩提交是什么意思?

压缩就是把几个提交变成一个提交,这个提交包含它们的全部改动。文件的最终内容完全一样,变的只是历史:审阅者看到的是一个提交、一条信息,而不是一串零碎的修复。

Git 怎么压缩最近 N 个提交?
运行 git rebase -i HEAD~N(例如用 HEAD~3 处理最近三个)。在编辑器中,第一个提交保持 pick,其余的改为 squash(或者改为 fixup,丢弃它们的信息)。保存后编辑合并后的提交信息,这些提交就会合成一个。
squash 和 fixup 有什么区别?
两者都会把一个提交并入上一个提交。squash 保留该提交的信息,让你在编辑器中把它和其他信息合并。fixup 完全丢弃该提交的信息,只保留前一个提交的信息,很适合那些不想出现在最终信息里的“哎呀,小修复”式提交。
合并时怎么把整个分支压缩成一个提交?
使用 git merge --squash feature,然后运行 git commit。这会把该分支的所有改动作为已暂存的改动应用过来,让你在目标分支上把它们记录为一个提交,而不会带入分支上的各个单独提交。GitHub 的“Squash and merge”按钮做的是同样的事。
不用交互式变基也能压缩吗?
可以。git reset --soft HEAD~N 把分支往回移动 N 个提交,同时把它们的所有改动保留在暂存区,然后一次 git commit 就能把它们记录为一个提交。这是不打开变基编辑器、快速压缩最近几个提交的方法。
合并之前应该压缩提交吗?
很多团队都会这样做,让每个功能以一个提交的形式落地,便于阅读,也便于 revert。代价是失去一步步的开发历史。在只有你使用的分支上可以随意压缩;在共享分支上要先和大家商量,因为被改写的提交会迫使其他人重置自己的副本。
可以在线练习吗?

可以。打开终端在线编辑器,就能在浏览器里的真实 shell 中进行交互式变基,无需安装。Coddy 的免费互动 Git 课程也会一步步教你变基和整理历史。

Coddy 编程语言插图

在 Coddy 学习 Git

开始