如何把最近 N 个提交压缩成一个
压缩最近 N 个提交:git rebase -i HEAD~N,把除第一条外的 pick 全改成 squash 或 fixup,保存后编辑最终提交信息。已推送需 --force-with-lease 强推;纯本地操作零风险。
交互式 rebase 搞定:git rebase -i HEAD~N(N 是要压缩的提交数),编辑器里第一条保留 pick,后面全部改成 squash(或 fixup),保存退出后编辑合并的提交信息即可。
操作示例:压缩最近 3 个
git rebase -i HEAD~3
编辑器中(最旧在上):
pick a1b2c3d 实现登录接口
squash e4f5g6h 修个拼写
squash i7j8k9l 又改了下注释
保存 → 弹出新编辑器写最终提交信息 → 完成。三个提交变成一条。
squash 和 fixup 的选择
squash:合并后让你编辑信息(几条原文都列出供取舍);fixup:直接丢弃被合并提交的信息,只留第一条的——修 typo 类提交用 fixup 最利落。
替代方案:reset --soft
提交信息想完全重写、改动全在一个文件域时,这条路更快:
git reset --soft HEAD~3 # 3 个提交全回暂存区
git commit -m "实现登录接口" # 重新提交为一个
常见问题(FAQ)
Q:压缩已推送的提交?
可以但需 git push --force-with-lease 强推。分支有别人协作就别压了,或者用 GitHub 的 Squash merge 在合并时压。
Q:rebase -i 里把顺序搞乱了怎么办?
git rebase --abort 随时放弃重来。开始之前 git branch backup 打个保险也行。
Q:HEAD~N 里混着别人的提交(已拉过远程)?
千万别压别人的提交。git log origin/main..HEAD --oneline 先确认这 N 个全是你的。