Git Merge命令介绍(把指定分支的提交历史合并到当前分支)经典合并、Fast-Forward快进合并FF Merge、三方合并、merge commit、squash merge、合并冲突
git merge用于:把另一个分支的提交历史整合到当前分支。意思是:把分支的修改合并到当前所在分支。A──B──CF──G main这时候:无法直接快进找共同祖先比较双方改动创建 merge commitD──E/ \F──G共同祖先当前分支被合并分支三个节点。git merge是 Git 协作模型的核心。代码合并工具团队开发历史管理机制Git 分支模型commit DAG团队协作PR 工作流r
文章目录
- Git Merge 完全指南:理解 Git 分支合并机制
- 一、什么是 git merge?
- 二、merge 的核心思想
- 三、最经典的 merge 流程
- 四、Fast-Forward Merge(快进合并)
- 五、什么是 Three-Way Merge(三方合并)
- 六、merge commit 是什么?
- (补充)为什么要用 merge commit?
- 七、git merge 常用命令
- 1. 合并分支
- 2. 不创建 Fast-Forward
- 3. 只允许 Fast-Forward
- 4. squash merge
- 八、merge conflict(合并冲突)
- 九、冲突文件长什么样?
- 十、解决 merge conflict
- 十一、放弃 merge
- 十二、查看 merge 历史
- 十三、merge 与 rebase 的区别
- 十四、merge 的最佳实践
- 1. 小步合并
- 2. merge 前先 pull
- 3. 使用 Pull Request
- 4. 重要分支使用 --no-ff
- 5. 学会看 graph
- 十五、merge 的本质理解(非常重要)
- 十六、实际团队开发中的 merge 流程
- 十七、总结
Git Merge 完全指南:理解 Git 分支合并机制
在日常 Git 开发中,分支(branch)是最核心的工作方式之一。
我们通常会:
- 在 feature 分支开发功能
- 在 bugfix 分支修复问题
- 在 release 分支准备发布
而当开发完成后,就需要把这些修改“合并”回主线分支。
这时候就会使用:
git merge
git merge 是 Git 中最重要的命令之一,它负责:
- 合并分支历史
- 整合代码修改
- 保留开发轨迹
- 构建团队协作流程
这篇文章将全面介绍:
- git merge 的原理
- merge 的工作流程
- Fast-Forward 与 Three-Way Merge
- merge conflict(合并冲突)
- 常见 merge 策略
- merge 最佳实践
一、什么是 git merge?
git merge 用于:
把另一个分支的提交历史整合到当前分支。
例如:
git merge feature/login
意思是:
把
feature/login分支的修改合并到当前所在分支。
注意:
merge 是“合并到当前分支”
很多新人容易理解反。
比如:
git checkout main
git merge feature/login
真正含义是:
把 feature/login 合并进 main
不是反过来。
二、merge 的核心思想
Git 的 merge 本质上是:
寻找共同祖先(merge base)
然后整合两个分支的差异
Git 会:
- 找到两个分支共同祖先
- 对比双方修改
- 自动合并代码
- 创建新的 merge commit(某些情况不会)
三、最经典的 merge 流程
假设:
main
└── A──B──C
|
feature └──D──E
现在:
git checkout main
git merge feature
merge 后:
main
└── A──B──C────M
\ /
D──E
这里:
M就是 merge commit- Git 保留了两条历史
- merge commit 有两个 parent
这是 Git 最标准的分支整合方式。
四、Fast-Forward Merge(快进合并)
这是最常见的一种 merge。
场景
A──B──C main
\
D──E feature
如果:
- main 在 feature 创建后没有新提交
- main 只是“落后”于 feature
那么 merge 时:
git checkout main
git merge feature
Git 会直接:
A──B──C──D──E
不会创建 merge commit。
这叫:
Fast-Forward Merge(FF Merge)
意思是:
main 指针直接向前移动。
五、什么是 Three-Way Merge(三方合并)
如果两个分支都发生了新提交:
D──E feature
/
A──B──C
\
F──G main
这时候:
-
无法直接快进
-
Git 必须:
- 找共同祖先
- 比较双方改动
- 创建 merge commit
结果:
D──E
/ \
A──B──C─────M
\
F──G
这就是:
Three-Way Merge
因为涉及:
- 共同祖先
- 当前分支
- 被合并分支
三个节点。
六、merge commit 是什么?
merge commit 是:
一个拥有多个 parent 的 commit。
普通 commit:
parent -> current
merge commit:
parent1 -> merge
parent2 -> merge
查看:
git log --graph --oneline
效果:
* a1b2c3 Merge branch 'feature'
|\
| * e5f6g7 feature commit
* | h8i9j0 main commit
|/
(补充)为什么要用 merge commit?
✅ 保留完整历史:
合并后,你依然能清晰看到 feature 分支是从哪来的、改了什么
(如果不用 merge commit,历史会被“压平”,丢失分支信息)
✅ 可追溯性:
当需要回滚或排查问题时,能明确知道这个合并操作连接了哪两个分支
七、git merge 常用命令
1. 合并分支
git merge feature/login
2. 不创建 Fast-Forward
git merge --no-ff feature/login
即使能 FF,也强制创建 merge commit。
适合:
- 保留功能开发历史
- 方便回滚 feature
- 团队协作
结果:
main ─── M
/
feature
3. 只允许 Fast-Forward
git merge --ff-only feature/login
如果不能 FF:
merge aborted
常用于:
- 保持线性历史
- 禁止 merge commit
4. squash merge
git merge --squash feature/login
作用:
把整个 feature 分支压缩成一个提交。
特点:
- 不保留 feature 历史
- 不生成 merge commit
- 提交历史更干净
适合:
- 小功能
- 杂乱提交
- 临时分支
八、merge conflict(合并冲突)
这是 Git merge 中最重要的问题。
冲突产生原因
两个分支:
- 修改了同一文件
- 修改了同一位置
Git 无法判断保留谁。
例如:
main:
name = "main"
feature:
name = "feature"
merge 时:
CONFLICT (content): Merge conflict in app.py
九、冲突文件长什么样?
Git 会插入:
<<<<<<< HEAD
name = "main"
=======
name = "feature"
>>>>>>> feature/login
含义:
<<<<<<< HEAD
当前分支内容
=======
对方分支内容
>>>>>>> feature/login
需要手动修改。
十、解决 merge conflict
步骤:
1. 编辑冲突文件
手动保留正确内容:
name = "new value"
删除:
<<<<<<<
=======
>>>>>>>
2. 标记已解决
git add app.py
3. 完成 merge
git commit
Git 会自动生成 merge commit。
十一、放弃 merge
如果 merge 一团糟:
git merge --abort
恢复到 merge 前状态。
非常有用。
十二、查看 merge 历史
图形查看
git log --graph --oneline --all
非常推荐。
查看 merge commit
git log --merges
十三、merge 与 rebase 的区别
这是 Git 中最经典的话题。
merge
特点:
- 保留真实历史
- 有 merge commit
- 分支结构清晰
历史:
A──B──C────M
\ /
D──E
rebase
特点:
- 改写历史
- 提交线性化
- 更干净
结果:
A──B──C──D'──E'
如何选择?
通常:
团队协作:
推荐:
merge
因为:
- 安全
- 不改历史
- 不容易出事故
个人 feature 整理:
推荐:
rebase
因为:
- 提交更干净
- 阅读体验更好
十四、merge 的最佳实践
1. 小步合并
不要:
一个月后一次性 merge
应该:
频繁同步
否则冲突会爆炸。
2. merge 前先 pull
git pull
确保分支最新。
3. 使用 Pull Request
现代团队一般:
feature -> PR -> review -> merge
而不是直接 merge。
4. 重要分支使用 --no-ff
例如:
git merge --no-ff feature/payment
这样未来:
git revert
更容易整体回滚 feature。
5. 学会看 graph
推荐:
git log --graph --decorate --oneline --all
这是理解 Git 历史最有效的方法。
十五、merge 的本质理解(非常重要)
很多人认为 merge 是:
“复制代码”
其实不是。
merge 本质是:
整合 commit 历史
Git 管理的是:
commit DAG(有向无环图)
merge 的核心:
连接两条提交链
代码变化只是结果。
十六、实际团队开发中的 merge 流程
典型流程:
1. 创建功能分支
git checkout -b feature/order-system
2. 开发提交
git commit
3. 同步主分支
git checkout main
git pull
4. 合并 feature
git merge --no-ff feature/order-system
5. 删除 feature
git branch -d feature/order-system
十七、总结
git merge 是 Git 协作模型的核心。
它不仅是:
代码合并工具
更是:
团队开发历史管理机制
理解 merge 后,你会真正理解:
- Git 分支模型
- commit DAG
- 团队协作
- PR 工作流
- rebase 与 merge 的区别
最后记住一句话:
merge 不是“复制代码”
而是“连接历史”
这才是 Git 最核心的思想。
更多推荐


所有评论(0)