Three-Way Merge 三方合并
Three-Way Merge(三方合并)当两个分支都有新提交时,Git 使用共同祖先作为基准进行合并。
什么是三方合并
当两个分支都从分叉点有新提交时,Git 使用三个版本进行合并:
- 共同祖先(Base):两分支的分叉点
- 当前分支(ours):目标分支的最新提交
- 合并分支( theirs):源分支的最新提交
合并原理
Bash
A(共同祖先)
↙ ↘
B C
↓ ↓
D E
↘ ↙
M(合并提交)
| 版本 | 角色 | 内容 |
|---|---|---|
| A | Base | 共同祖先 |
| D | ours | 目标分支提交 |
| E | theirs | 源分支提交 |
| M | Result | 合并结果 |
三方合并过程
Bash
# 合并流程
git checkout main
git merge feature
# 当无法快进时,Git 自动使用三方合并
Auto-merging src/main.go
CONFLICT (content): Merge conflict in src/main.go
Automatic merge failed; fix conflicts and then commit the result.
合并策略
Git 对不同文件采用不同策略:
| 策略 | 条件 | 结果 |
|---|---|---|
| 快进合并 | 目标分支无变更 | 直接移动指针 |
| 自动合并 | 修改不同部分 | 自动合并成功 |
| 冲突合并 | 修改相同部分 | 需手动解决 |
自动合并规则
Bash
Base 版本:
line1: 原内容A
ours 版本:
line1: 修改为B(其他行不变)
theirs 版本:
line1: 原内容A(未修改)
line2: 新增内容C
合并结果:
line1: 修改为B(采纳 ours)
line2: 新增内容C(采纳 theirs)
手动解决冲突
text
# 冲突文件内容
<<<<<<< HEAD
当前分支的内容(ours)
=======
合并分支的内容( theirs)
>>>>>>> feature
# 解决方法
# 1. 编辑文件,选择正确内容
# 2. 删除冲突标记
# 3. git add <file>
# 4. git commit
合并提交特点
- 有两个父提交
- 记录合并来源
- 保留分支历史
text
# 查看合并提交的父提交
git log --parents -1
# commit M (parent1: D, parent2: E)
三方合并是 Git 合并的核心算法,理解它有助于解决复杂的合并冲突。
要点总结
- 三方合并使用三个版本:Base、ours、 theirs
- 共同祖先作为合并基准
- 不同部分自动合并,相同部分产生冲突
- 合并提交有两个父提交
- 冲突需手动编辑文件解决
📝 发现内容有误?点击此处直接编辑