📖 知识点
1. 什么是合并冲突?
冲突(conflict) 发生在:两个分支都改了同一处(通常是同一行 / 同一块代码),Git 不知道该保留谁的,只能停下来请你手动裁决。
💡 生活比喻冲突像 "两份员工都填了同一个报表,数字还不一样":领导(Git)没法自己拍板,只好把两份都摆在你桌上,让你亲手定哪个对。
2. 冲突怎么产生?
典型场景:
master 分支: 小张把 订单模块.py 第5行 改成 A
功能分支: 老李把 订单模块.py 第5行 改成 B
→ 合并时,第5行有 A 和 B 两个版本,冲突!
只要两个分支对同一处代码做了不同修改,合并就可能冲突。
3. 冲突时的报错
git merge 分支名
运行示例:
Auto-merging 订单模块.py
CONFLICT (content): Merge conflict in 订单模块.py
Automatic merge failed; fix conflicts and then commit the result.
看到
CONFLICT就是冲突了。Git 暂停合并,等你处理。
4. 冲突标记长什么样
打开冲突文件,会看到:
def 价格():
<<<<<<< HEAD # 当前分支(master)的版本
return 15元
======= # 分隔线
return 20元
>>>>>>> 功能分支 # 功能分支的版本
<<<<<<< HEAD到=======是当前分支的版本,=======到>>>>>>> 功能分支是对方分支的版本。你要做的就是决定保留哪个(或合并两者),删掉标记。
⚠️ 易错提醒
冲突不是错误,是 Git 让你裁决 "同一处谁对"
冲突标记
<<<<<<<、=======、>>>>>>>记得删干净冲突没解决前,合并是暂停状态,解决了要
git commit才完成合并
⚔️ 剧情 Kata 实战任务
任务需求:
模拟冲突现场:分别在 master 和功能分支上改同一行
在 master 把某文件一行改成 A,提交
在功能分支把同一行改成 B,提交
在 master 上 merge 功能分支 → 触发冲突
观察冲突报错和文件里的冲突标记
参考代码(在终端依次敲)
# 0. 进仓库,在master创建订单模块.py(统一基准)
cd ~/外卖App
git switch master
echo "def 价格(): return 10元" > 订单模块.py
git add 订单模块.py
git commit -m "初始: 订单价格函数"
# 1. 小张在master改同一行 → A
echo "def 价格(): return 15元" > 订单模块.py
git add 订单模块.py
git commit -m "小张改: 价格15元"
# 2. 老李在功能分支改同一行 → B
git switch -c 老李改动
echo "def 价格(): return 20元" > 订单模块.py
git add 订单模块.py
git commit -m "老李改: 价格20元"
# 3. 切回master,合并 → 触发冲突
git switch master
git merge 老李改动
# 4. 查看冲突文件
cat 订单模块.py
运行示例:
user@linux:~/外卖App$ git merge 老李改动
Auto-merging 订单模块.py
CONFLICT (content): Merge conflict in 订单模块.py
Automatic merge failed; fix conflicts and then commit the result.
user@linux:~/外卖App$ cat 订单模块.py
def 价格():
<<<<<<< HEAD
return 15元
=======
return 20元
>>>>>>> 老李改动
💡 观察:
master 提交了 "价格 15 元",老李分支提交了 "价格 20 元",同一行两版
git merge 老李改动→ 报CONFLICT,合并暂停
cat看到冲突标记:HEAD 是 15 元,老李改动是 20 元 —— 冲突现场呈现!
🧠 思考题
冲突为什么会产生?什么样的修改最容易触发冲突?(提示:同一行 / 同一处不同改法)
冲突文件里的
<<<<<<< HEAD、=======、>>>>>>> 老李改动分别代表什么?谁的版本在 HEAD 区?