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 e4f5a6b 修复拼写
pick c7d8e9f 又修了一个拼写

改成:

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

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

squash 与 fixup

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

rebase 已经开始冲突了怎么办

若目标提交还在待执行列表中,用 git rebase --edit-todo 修改;已经重放的提交不会因此倒回。需要整体重排时可 git rebase --abort 后重启交互式 rebase,但 abort 会丢弃本轮冲突解决等进度,先保存需要的内容。

常见问题(FAQ)

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

能,但合并后历史变了,需要 git push --force-with-lease。共享分支不要这么干;个人分支也需确认没有他人基于旧提交工作,并核实远端状态。

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

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

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

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

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台