分支篇-Day16|冲突现场:合并冲突是什么、怎么产生(小张和老李改同一行)

11 次阅读 2026-10-30 14:19

📖 知识点

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 到 ======= 是当前分支的版本,======= 到 >>>>>>> 功能分支 是对方分支的版本。你要做的就是决定保留哪个(或合并两者),删掉标记。

⚠️ 易错提醒

  1. 冲突不是错误,是 Git 让你裁决 "同一处谁对"

  2. 冲突标记 <<<<<<<、=======、>>>>>>> 记得删干净

  3. 冲突没解决前,合并是暂停状态,解决了要 git commit 才完成合并

⚔️ 剧情 Kata 实战任务

任务需求:

  1. 模拟冲突现场:分别在 master 和功能分支上改同一行

  2. 在 master 把某文件一行改成 A,提交

  3. 在功能分支把同一行改成 B,提交

  4. 在 master 上 merge 功能分支 → 触发冲突

  5. 观察冲突报错和文件里的冲突标记

参考代码(在终端依次敲)

# 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元
>>>>>>> 老李改动

 

💡 观察:

  1. master 提交了 "价格 15 元",老李分支提交了 "价格 20 元",同一行两版

  2. git merge 老李改动 → 报 CONFLICT,合并暂停

  3. cat 看到冲突标记:HEAD 是 15 元,老李改动是 20 元 —— 冲突现场呈现!

🧠 思考题

  1. 冲突为什么会产生?什么样的修改最容易触发冲突?(提示:同一行 / 同一处不同改法)

  2. 冲突文件里的 <<<<<<< HEAD、=======、>>>>>>> 老李改动 分别代表什么?谁的版本在 HEAD 区?