Skip to content

🔗 第八章:合并策略 —— 让平行宇宙汇合

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.html
text
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>
&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
  <h1>小明的网站</h1>
&#61;&#61;&#61;&#61;&#61;&#61;&#61;
  <h1>小红的网站</h1>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature/新标题
</body>

解决冲突的步骤:

bash
# 第 1 步:打开文件,找到冲突标记
# &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD      → 你的版本
# &#61;&#61;&#61;&#61;&#61;&#61;&#61;           → 分隔符
# &gt;&gt;&gt;&gt;&gt;&gt;&gt; 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" 的快捷按钮,比手动编辑快多了。