rebase 过程中如何合并两个提交为一个

交互式 rebase 合并提交:git rebase -i HEAD~N 打开编辑列表,把要并入前一个提交的那行的 pick 改为 squash(或 s),保存后编辑合并后的提交信息即可。fixup 则丢弃该提交的信息。

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

用交互式 rebase 的 squash 命令:git rebase -i HEAD~N 打开提交列表,把想合并掉的那条(较新的提交)前面的 pick 改成 squash(缩写 s),保存退出——它会被合并进上一条提交,然后编辑合并后的提交信息。

操作示例

把最近 3 个提交中的后两个合并:

git rebase -i HEAD~3

编辑器里显示(最旧的在上):

pick a1b2c3d 添加登录接口
pick e4f5g6h 修复拼写
pick i7j8k9l 又修了一个拼写

改成:

pick a1b2c3d 添加登录接口
squash e4f5g6h 修复拼写
squash i7j8k9l 又修了一个拼写

保存后会再弹一个编辑器让你写合并后的提交信息,保存即完成。

squash 与 fixup

  • squash(s):合并提交,并让你编辑合并后的提交信息(几条信息默认都列出);
  • fixup(f):合并提交,直接丢弃被合并提交的信息,保留上一条的信息——"顺手修个小错"类提交用 fixup 更利落。

rebase 已经开始冲突了怎么办

正在 rebase 中想调整方案:git rebase --abort 完全退出回到开始前,重新 git rebase -i 规划即可。rebase 前的状态随时可放弃,不用硬着头皮做完。

常见问题(FAQ)

Q:已经推送到远程的提交能合并吗?

能,但合并后历史变了,需要 git push --force-with-lease。共享分支不要这么干;个人分支没问题。

Q:合并提交信息不想要那堆 "fix typo" 记录?

用 fixup,或在 squash 后的编辑界面里删掉多余行,只保留最终想要的信息。

Q:能合并不相邻的两个提交吗?

可以:在 rebase -i 列表里把较新的提交移动到目标提交下方(直接剪贴行),再标 squash。注意移动顺序可能引入冲突。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台