交互式变基(git rebase -i)可将最近3条提交压为1条:运行git rebase -i head~3,将第2、3行pick改为s(squash)或f(fixup),保留第1行为pick,保存后编辑新提交信息;已推送需强制推送git push --force-with-lease。

git rebase -i 合并最近几条提交记录
想把最近的 3 条提交压成 1 条,最直接的方式就是交互式变基。它不改代码内容,只改提交历史结构,适合还没推送到远程分支时操作。
- 运行
git rebase -i HEAD~3(把3换成你要合并的数量) - 编辑器会打开一个列表,把第 2、3 行开头的
pick改成s(squash)或f(fixup),保留第 1 行为pick - 保存退出后,Git 会再打开一次编辑器让你写新提交信息;
fixup会直接丢弃后续提交的 commit message,squash会合并并允许你编辑 - 如果中途出错(比如冲突),解决完记得
git add .再git rebase --continue
已经 push 过去了还能合并吗
能,但要强制推送,前提是没人基于你的旧提交继续开发——否则会搞乱协作者的历史。
- 先按上面方法做完
git rebase -i - 然后
git push --force-with-lease origin main(推荐用--force-with-lease而不是--force,它会拒绝覆盖别人新推的提交) - 如果远程提示 “non-fast-forward”,说明有人已更新分支,这时得先
git pull --rebase拉下来再重试,或者协调队友暂停提交
git commit --amend 只能改最新一条提交
这个命令不是用来“合并多条”的,它只追加改动到上一次提交,并替换掉它。误以为能合并多条,是常见误解。
-
git commit --amend适合:刚提交完发现漏了文件、写错了 message - 它不会碰倒数第二条及更早的提交,想合并多条必须用
rebase -i - 如果已经
push过,--amend后也得git push --force-with-lease
合并时遇到冲突怎么处理
rebase 过程中冲突很常见,尤其当被 squash 的提交修改了同一段代码。关键不是跳过,而是确保逻辑没丢。
- Git 会停在冲突处,用
git status看哪些文件有冲突 - 手动编辑文件,删掉
<code>======>>>>标记,保留最终想要的代码 -
git add <file></file>标记解决,再git rebase --continue - 不想继续了?
git rebase --abort会完全回退到 rebase 前状态











