文章目录
- 1.简介
- 2.格式
- 3.选项
- [4. 示例](#4. 示例)
-
- [4.1 基础合并](#4.1 基础合并)
- [4.2 禁用快进合并(推荐团队协作)](#4.2 禁用快进合并(推荐团队协作))
- [4.3 只允许快进合并](#4.3 只允许快进合并)
- [4.4 压缩合并](#4.4 压缩合并)
- [4.5 解决冲突](#4.5 解决冲突)
- 5.注意
-
- [5.1 合并策略对比](#5.1 合并策略对比)
- [5.2 查看合并历史](#5.2 查看合并历史)
- [5.3 撤销合并](#5.3 撤销合并)
- [5.4 常用别名设置](#5.4 常用别名设置)
- [6. 小结](#6. 小结)
- 参考文献
1.简介
git merge 用于将两个或多个分支的修改合并到一起。通常用于将功能分支(feature)合并回主分支(main)。
合并时,Git 会根据分支的提交历史自动选择合并策略:
- 快进合并(Fast-forward):当前分支没有新提交,直接将指针向前移动
- 三方合并(3-Way Merge):两个分支都有新提交,创建一个新的合并提交
2.格式
bash
git merge [<options>] <branch>
git merge (--continue | --abort | --quit)
3.选项
bash
--ff
当前分支完全包含了被合并分支的提交时,应如何处理合并。-ff 是允许快进(默认)。
快进(Fast-Forward) 是 Git 合并时的一种特殊情况:当目标分支(如 main)自创建功能分支(如 feature)以来没有产生新的提交时,Git 只需将 main 的指针直接向前移动到 feature 的最新提交,就像"顺着链条快进"一样,不创建新的合并提交,历史变成一条直线。
--no-ff
禁用快进合并,强制创建合并提交
--ff-only
只允许快进合并,否则报错。
--squash
压缩合并,将多个提交合并为一个变更(不创建合并提交)
--abort
中止当前有冲突的合并
--quit
就地停止:忘记当前合并,不再继续。但保留工作区和暂存区的所有修改(包括冲突和已解决的内容)
--continue
解决冲突后继续合并
-m <msg>
为合并提交指定消息
--no-commit
合并但不自动提交(用于进一步调整)
--stat
显示差异统计,即修改了多少个文件,多少行插入,多少行删除。默认行为
-n, --no-stat
不显示差异统计
4. 示例
4.1 基础合并
bash
# 切换到目标分支
git switch main
# 将 feature 分支合并到 main
git merge feature
4.2 禁用快进合并(推荐团队协作)
bash
# 强制创建合并提交,保留分支历史
git merge --no-ff feature -m "merge feature: 添加用户登录功能"
4.3 只允许快进合并
bash
# 如果不能快进则报错(常用于拉取上游更新)
git merge --ff-only origin/main
只允许快进合并的核心使用场景是:当你明确知道当前分支没有新提交,只是想"追上"上游分支的最新代码时,用它来防止意外创建合并提交。
4.4 压缩合并
假设分支历史如下:
main: A---B---C
\
feature: D---E---F
普通合并:
bash
git switch main
git merge feature
结果:
main: A---B---C---------M
\ /
feature: D---E---F
- M 是合并提交,有两个父提交(C 和 F)
- feature 的所有提交(D、E、F)都保留在历史中
优点: 完整保留分支历史
缺点: 历史中会包含大量零碎提交(如 fix typo、update 等)
使用 --squash 合并:
bash
git switch main
# 将 feature 的所有提交压缩成一个变更
git merge --squash feature
git commit -m "feat: 添加用户登录功能"
结果:
main: A---B---C---S
feature: D---E---F
- S 是普通提交,不是合并提交
- feature 的所有变更被压缩成一个提交 S
- feature 分支的 D、E、F 提交不会进入 main 历史
优点: 主分支历史保持线性、整洁
缺点: 丢失 feature 分支的详细开发历史
一图看懂:

判断是否使用 --squash 选项最根本的标准是,待合并分支上的历史记录是否有意义。如果没有意义,建议使用 --squash 选项将其废弃。
4.5 解决冲突
bash
# 尝试合并时出现冲突
git merge feature
# CONFLICT in main.go
# 手动解决冲突后
git add .
git merge --continue
# 或放弃合并
git merge --abort
5.注意
5.1 合并策略对比
| 场景 | 命令 | 效果 |
|---|---|---|
| 默认合并(可快进) | git merge feature |
直接移动指针,无合并提交 |
| 默认合并(不可快进) | git merge feature |
自动创建合并提交 |
| 强制创建合并提交 | git merge --no-ff feature |
总是创建合并提交,保留分支历史 |
| 只允许快进 | git merge --ff-only feature |
不能快进时报错 |
| 压缩合并 | git merge --squash feature |
将所有提交压缩为一个变更 |
5.2 查看合并历史
bash
# 查看分支图(直观展示合并关系)
git log --oneline --graph --all
# 查看哪些分支已合并到当前分支
git branch --merged
# 查看哪些分支尚未合并到当前分支
git branch --no-merged
5.3 撤销合并
bash
# 撤销最近一次合并(假设还没推送)
git reset --hard HEAD~1
# 如果已推送,使用 revert(保留历史)
git revert -m 1 HEAD
5.4 常用别名设置
bash
git config --global alias.mnf "merge --no-ff"
git config --global alias.mffo "merge --ff-only"
# 使用别名
git mf feature
git mffo origin/main
6. 小结
| 需求 | 命令 | 说明 |
|---|---|---|
| 普通合并 | git checkout main && git merge feature |
默认行为 |
| 强制创建合并提交 | git merge --no-ff feature |
保留分支历史,推荐团队协作 |
| 只允许快进 | git merge --ff-only upstream/main |
避免意外合并提交 |
| 压缩合并 | git merge --squash feature |
保持主干历史整洁 |
| 中止冲突合并 | git merge --abort |
安全退出冲突状态 |
| 解决冲突后继续 | git add . && git merge --continue |
继续合并 |
一句话总结 :git merge 用于将不同分支的工作整合到一起。推荐团队协作使用 --no-ff 保留分支历史;遇到冲突时用 --abort 安全退出;合并前先用 git branch --merged 确认分支状态。