日常开发中,我们经常在同一个分支上连续提交多次(修 typo、补测试、小调整等),合并到主分支前希望把这段历史整理成一条清晰的提交。本文介绍如何把多次提交合并成一次,并说明合并后历史会怎样变化。
一、先看清当前分支的提交记录
合并前,先确认要合并的是哪几条提交。
简洁列表(推荐):
bash
git log --oneline
带分支图、看最近 20 条:
bash
git log --oneline --graph -20
示例输出:
a1b2c3d (HEAD -> feature/login) 修复登录页样式
e4f5g6h 补充单元测试
i7j8k9l 实现登录接口
m0n1o2p 添加登录页组件
p3q4r5s 初始化项目 (main)
这里的「最近几次」指的是当前所在分支 上、从 HEAD 往前数的提交。HEAD~5 就表示当前分支上最近 5 次提交。
二、合并后历史会变少吗?
会。合并(squash)后,这段历史里的提交条数会变少。
- 合并前:例如最近 5 条提交 → 历史里有 5 条记录。
- 合并后:这 5 条被压成 1 条 → 这段只算 1 条记录。
注意:被合并掉的提交的 commit hash 会变,相当于重写了这段历史。若已经推送到远程,需要配合强制推送(见下文)。
三、方法一:交互式变基(可精细控制)
适合想挑选要合并的提交、调整顺序或编辑说明的场景。
1. 合并当前分支最近 N 次提交
例如合并最近 5 次:
bash
git rebase -i HEAD~5
2. 在编辑器中修改指令
会打开类似下面的列表:
pick p3q4r5s 初始化项目
pick m0n1o2p 添加登录页组件
pick i7j8k9l 实现登录接口
pick e4f5g6h 补充单元测试
pick a1b2c3d 修复登录页样式
把从第 2 条起 的 pick 改成 squash(或简写 s),保留第 1 条为 pick:
pick p3q4r5s 初始化项目
squash m0n1o2p 添加登录页组件
squash i7j8k9l 实现登录接口
squash e4f5g6h 补充单元测试
squash a1b2c3d 修复登录页样式
保存并关闭编辑器。
3. 编写合并后的提交说明
接下来会再弹出一个编辑器,把多条提交说明合并成一条,例如:
# 请修改本次合并的提交说明,以 '#' 开头的行会被忽略
feat: 登录功能
- 添加登录页组件
- 实现登录接口
- 补充单元测试
- 修复登录页样式
保存后,这 5 条提交就变成 1 条。
4. 若已推送到远程
历史被重写,需要强制推送(建议用 --force-with-lease):
bash
git push --force-with-lease
四、方法二:软重置 + 重新提交(最简单)
不打开交互界面,直接把「最近 N 次提交」撤销成未提交的改动,再一次性提交。
示例:把最近 3 条合成 1 条
合并前:
a1b2c3d 修复登录页样式
e4f5g6h 补充单元测试
i7j8k9l 实现登录接口
执行:
bash
# 撤销最近 3 条提交,改动保留在暂存区
git reset --soft HEAD~3
# 用一条新提交包含所有改动
git commit -m "feat: 登录功能(组件、接口、测试与样式修复)"
合并后:
x9y8z7w feat: 登录功能(组件、接口、测试与样式修复)
同样,若已推送过,需要:
bash
git push --force-with-lease
五、两种方式对比
| 方式 | 适用场景 |
|---|---|
| 交互式变基 | 想选择合并哪些提交、调整顺序、保留/编辑多条说明 |
| 软重置 + 提交 | 只关心「最近 n 条合成 1 条」,操作最少 |
六、小结
- 用
git log --oneline(或--graph -n)查看当前分支的提交记录。 - 「最近 5 次」= 当前分支上
HEAD~5,不是别的分支。 - 合并后提交次数会变少 ,对应历史被重写,已推送时需
git push --force-with-lease。 - 需要精细控制用
git rebase -i HEAD~n;图省事用git reset --soft HEAD~n+git commit。
按需选一种方式,即可在合并到主分支前把本地多次提交整理成一条清晰记录。