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

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

相关推荐
火车叼位4 小时前
一次看懂 Git 仓库分叉、冲突已解决但仍在合并中的状态
git
ruanCat5 小时前
simple-git-hooks 踩坑实录:钩子装对了却从没触发过,原来是 .git 目录捣的鬼
前端·git·代码规范
葱卤山猪7 小时前
Git常用核心命令实操总结(新手避坑版)
大数据·git·elasticsearch
深蓝轨迹7 小时前
Git误操作急救手册
chrome·git·elasticsearch
无限进步_7 小时前
【C++】字符串中的字母反转算法详解
开发语言·c++·ide·git·算法·github·visual studio
Tipriest_18 小时前
git reflog介绍(找回之前detach后做的commit)
git
一个有温度的技术博主19 小时前
Git系列四:git的基本概念
git
饕餮争锋21 小时前
git常见场景对应的命令
git
乐之者v1 天前
Intellij Idea修改Git远程地址
git