Git 合并多次提交记录实战

日常开发中,我们经常在同一个分支上连续提交多次(修 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

按需选一种方式,即可在合并到主分支前把本地多次提交整理成一条清晰记录。

相关推荐
淘矿人1 天前
从0到1:用Claude启动你的第一个项目
开发语言·人工智能·git·python·github·php·pygame
lpfasd1231 天前
Git/Gitee/GitHub 3 个安全凭证详解
git·gitee·github
李日灐1 天前
< 7 > Linux 开发工具:git 版本控制器 和 cgdb/gdb 调试器
linux·运维·服务器·开发语言·git·调试器·gdb/cgdb
Gust of wind1 天前
idea结合git和Gitee的初步使用
git·gitee·intellij-idea
夜七少eleanor1 天前
【Git】2026全图文详解安装教程
git
海边的Kurisu1 天前
从零开始的Git生活 | 刚实习同学的噩梦 And 参与开源不可缺的一环
git·生活
不老刘1 天前
Git Cherry-Pick:微前端架构下的“精准医疗”与最佳实践
前端·git
爬楼的猪1 天前
Git Folder Dashboard
git
Uncertainty!!1 天前
claude code中添加skills自动生成git commit信息
git·git commit·claude code
FserSuN2 天前
Git Worktree 使用学习
git·学习