🔗 第八章:合并策略 —— 让平行宇宙汇合
Fast-Forward 合并
当主分支没有任何新提交,而目标分支在主分支的基础上"直线前进"时,Git 会直接把主分支的指针移到目标分支的位置。这就是"快进合并"。
bash
# 场景:小明在 feature 分支上开发,main 分支没有新提交
# 切回 main
git switch main
# 合并 feature 分支
git merge feature/用户登录
Updating f4e5d6c..a7b8c9d
Fast-forward
login.html | 15 +++++++++++++++
style.css | 3 +++
2 files changed, 18 insertions(+)
create mode 100644 login.htmltext
Fast-Forward 示意图:
合并前:
main → A → B
feature → A → B → C → D
合并后(快进):
main → A → B → C → D (main 指针移到 D)
feature → A → B → C → D如果你不想快进,而是想保留合并记录,可以用 --no-ff:
bash
# 强制创建合并提交(推荐!保留分支历史)
git merge --no-ff feature/用户登录 -m "merge: 合并用户登录功能"三方合并
当两个分支都有各自的新提交时,Git 需要做一个"三方合并"——找到两个分支的共同祖先,然后合并两个分支各自的修改。
bash
# 场景:main 和 feature 分支都有新提交
git switch main
git merge feature/商品搜索
Merge made by the 'ort' strategy.
search.html | 20 ++++++++++++++++++++
style.css | 5 +++++
2 files changed, 25 insertions(+)合并冲突 —— 新手的噩梦
当两个分支修改了同一个文件的同一个位置,Git 就懵了——它不知道该用谁的。这时候就会产生合并冲突。
bash
# 场景:小明和小红都改了 index.html 的标题
git switch main
git merge feature/新标题
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.打开冲突的文件,你会看到这样的标记:
html
<body>
<<<<<<< HEAD
<h1>小明的网站</h1>
=======
<h1>小红的网站</h1>
>>>>>>> feature/新标题
</body>解决冲突的步骤:
bash
# 第 1 步:打开文件,找到冲突标记
# <<<<<<< HEAD → 你的版本
# ======= → 分隔符
# >>>>>>> feature → 对方的版本
# 第 2 步:手动编辑,决定保留什么
# 可以选择保留其中一个,或者合并两者的修改
# 同时删除所有冲突标记 <<< === >>>
# 第 3 步:添加到暂存区
git add index.html
# 第 4 步:提交合并
git commit -m "merge: 解决 index.html 标题冲突"
# 如果不想合并了,想回到合并前的状态
git merge --abort💡 提示: 解决冲突时,推荐使用 VS Code 或其他可视化工具。VS Code 会高亮冲突区域,并提供 "Accept Current"、"Accept Incoming"、"Accept Both" 的快捷按钮,比手动编辑快多了。