合并冲突产生原因
合并冲突发生在两个分支修改了同一文件的同一位置时,Git 无法自动决定使用哪个版本。
什么是合并冲突
合并冲突是指 Git 无法自动合并两个分支的变更,需要人工干预决定最终内容。
冲突产生条件
Bash
分支A 修改了文件的第 10 行:content = "A"
分支B 修改了文件的第 10 行:content = "B"
合并时冲突!Git 不知道用 "A" 还是 "B"
冲突产生原因
| 原因 | 说明 |
|---|---|
| 同位置修改 | 两分支修改同一文件的同一行 |
| 一方删除一方修改 | 一方删除文件,另一方修改文件 |
| 文件重命名冲突 | 一方重命名,另一方修改 |
| 模式冲突 | 一方改文件模式,另一方改内容 |
冲突类型示例
同位置冲突
Bash
# 分支A 的修改
title = "Hello A"
# 分支B 的修改
title = "Hello B"
# 合并时冲突
<<<<<<< HEAD
title = "Hello A"
=======
title = "Hello B"
>>>>>>> branchB
删除与修改冲突
text
# 分支A 删除了文件
rm config.yaml
# 分支B 修改了文件
# config.yaml 内容变更
# 合并时冲突
CONFLICT (modify/delete): config.yaml deleted in HEAD
Git 的自动合并规则
| 情况 | Git 行为 |
|---|---|
| 修改不同文件 | 自动合并成功 |
| 修改同一文件不同位置 | 自动合并成功 |
| 修改同一文件同一位置 | 产生冲突 |
| 一方删除一方修改 | 产生冲突 |
三方合并原理
text
Base(共同祖先)
↙ ↘
A B
↓ ↓
修改1 修改2
Base: title = "Original"
A: title = "Hello A" (修改了同一行)
B: title = "Hello B" (修改了同一行)
无法自动决定 → 冲突
如何减少冲突
| 方法 | 说明 |
|---|---|
| 模块化设计 | 不同人修改不同文件 |
| 小步提交 | 减少每次提交的变更量 |
| 频繁同步 | 及时 pull 上游更新 |
| 沟通协作 | 了解他人的修改范围 |
冲突不可避免,但良好的协作习惯可以减少冲突频率。
要点总结
- 同一文件同一位置被不同分支修改会产生冲突
- 删除与修改、重命名与修改也会冲突
- Git 只能自动合并不同位置的修改
- 三方合并使用共同祖先作为基准
- 模块化设计和频繁同步可减少冲突
📝 发现内容有误?点击此处直接编辑