Git Merge 完全指南:理解 Git 分支合并机制

在日常 Git 开发中,分支(branch)是最核心的工作方式之一。

我们通常会:

  • 在 feature 分支开发功能
  • 在 bugfix 分支修复问题
  • 在 release 分支准备发布

而当开发完成后,就需要把这些修改“合并”回主线分支。

这时候就会使用:

git merge

git merge 是 Git 中最重要的命令之一,它负责:

  • 合并分支历史
  • 整合代码修改
  • 保留开发轨迹
  • 构建团队协作流程

这篇文章将全面介绍:

  • git merge 的原理
  • merge 的工作流程
  • Fast-Forward 与 Three-Way Merge
  • merge conflict(合并冲突)
  • 常见 merge 策略
  • merge 最佳实践

一、什么是 git merge?

git merge 用于:

把另一个分支的提交历史整合到当前分支。

例如:

git merge feature/login

意思是:

feature/login 分支的修改合并到当前所在分支。

注意:

merge 是“合并到当前分支”

很多新人容易理解反。

比如:

git checkout main
git merge feature/login

真正含义是:

把 feature/login 合并进 main

不是反过来。


二、merge 的核心思想

Git 的 merge 本质上是:

寻找共同祖先(merge base)
然后整合两个分支的差异

Git 会:

  1. 找到两个分支共同祖先
  2. 对比双方修改
  3. 自动合并代码
  4. 创建新的 merge commit(某些情况不会)

三、最经典的 merge 流程

假设:

main
 └── A──B──C
        |
feature └──D──E

现在:

git checkout main
git merge feature

merge 后:

main
 └── A──B──C────M
          \    /
           D──E

这里:

  • M 就是 merge commit
  • Git 保留了两条历史
  • merge commit 有两个 parent

这是 Git 最标准的分支整合方式。


四、Fast-Forward Merge(快进合并)

这是最常见的一种 merge。

场景

A──B──C  main
       \
        D──E feature

如果:

  • main 在 feature 创建后没有新提交
  • main 只是“落后”于 feature

那么 merge 时:

git checkout main
git merge feature

Git 会直接:

A──B──C──D──E

不会创建 merge commit。

这叫:

Fast-Forward Merge(FF Merge)

意思是:

main 指针直接向前移动。


五、什么是 Three-Way Merge(三方合并)

如果两个分支都发生了新提交:

       D──E feature
      /
A──B──C
      \
       F──G main

这时候:

  • 无法直接快进

  • Git 必须:

    • 找共同祖先
    • 比较双方改动
    • 创建 merge commit

结果:

       D──E
      /    \
A──B──C─────M
      \
       F──G

这就是:

Three-Way Merge

因为涉及:

  1. 共同祖先
  2. 当前分支
  3. 被合并分支

三个节点。


六、merge commit 是什么?

merge commit 是:

一个拥有多个 parent 的 commit。

普通 commit:

parent -> current

merge commit:

parent1 -> merge
parent2 -> merge

查看:

git log --graph --oneline

效果:

*   a1b2c3 Merge branch 'feature'
|\
| * e5f6g7 feature commit
* | h8i9j0 main commit
|/

(补充)为什么要用 merge commit?

保留完整历史
合并后,你依然能清晰看到 feature 分支是从哪来的、改了什么
(如果不用 merge commit,历史会被“压平”,丢失分支信息)

可追溯性
当需要回滚或排查问题时,能明确知道这个合并操作连接了哪两个分支

七、git merge 常用命令

1. 合并分支

git merge feature/login

2. 不创建 Fast-Forward

git merge --no-ff feature/login

即使能 FF,也强制创建 merge commit。

适合:

  • 保留功能开发历史
  • 方便回滚 feature
  • 团队协作

结果:

main ─── M
        /
feature

3. 只允许 Fast-Forward

git merge --ff-only feature/login

如果不能 FF:

merge aborted

常用于:

  • 保持线性历史
  • 禁止 merge commit

4. squash merge

git merge --squash feature/login

作用:

把整个 feature 分支压缩成一个提交。

特点:

  • 不保留 feature 历史
  • 不生成 merge commit
  • 提交历史更干净

适合:

  • 小功能
  • 杂乱提交
  • 临时分支

八、merge conflict(合并冲突)

这是 Git merge 中最重要的问题。

冲突产生原因

两个分支:

  • 修改了同一文件
  • 修改了同一位置

Git 无法判断保留谁。

例如:

main:

name = "main"

feature:

name = "feature"

merge 时:

CONFLICT (content): Merge conflict in app.py

九、冲突文件长什么样?

Git 会插入:

<<<<<<< HEAD
name = "main"
=======
name = "feature"
>>>>>>> feature/login

含义:

<<<<<<< HEAD
当前分支内容

=======
对方分支内容

>>>>>>> feature/login

需要手动修改。


十、解决 merge conflict

步骤:

1. 编辑冲突文件

手动保留正确内容:

name = "new value"

删除:

<<<<<<<
=======
>>>>>>>

2. 标记已解决

git add app.py

3. 完成 merge

git commit

Git 会自动生成 merge commit。


十一、放弃 merge

如果 merge 一团糟:

git merge --abort

恢复到 merge 前状态。

非常有用。


十二、查看 merge 历史

图形查看

git log --graph --oneline --all

非常推荐。


查看 merge commit

git log --merges

十三、merge 与 rebase 的区别

这是 Git 中最经典的话题。

merge

特点:

  • 保留真实历史
  • 有 merge commit
  • 分支结构清晰

历史:

A──B──C────M
     \    /
      D──E

rebase

特点:

  • 改写历史
  • 提交线性化
  • 更干净

结果:

A──B──C──D'──E'

如何选择?

通常:

团队协作:

推荐:

merge

因为:

  • 安全
  • 不改历史
  • 不容易出事故

个人 feature 整理:

推荐:

rebase

因为:

  • 提交更干净
  • 阅读体验更好

十四、merge 的最佳实践

1. 小步合并

不要:

一个月后一次性 merge

应该:

频繁同步

否则冲突会爆炸。


2. merge 前先 pull

git pull

确保分支最新。


3. 使用 Pull Request

现代团队一般:

feature -> PR -> review -> merge

而不是直接 merge。


4. 重要分支使用 --no-ff

例如:

git merge --no-ff feature/payment

这样未来:

git revert

更容易整体回滚 feature。


5. 学会看 graph

推荐:

git log --graph --decorate --oneline --all

这是理解 Git 历史最有效的方法。


十五、merge 的本质理解(非常重要)

很多人认为 merge 是:

“复制代码”

其实不是。

merge 本质是:

整合 commit 历史

Git 管理的是:

commit DAG(有向无环图)

merge 的核心:

连接两条提交链

代码变化只是结果。


十六、实际团队开发中的 merge 流程

典型流程:

1. 创建功能分支

git checkout -b feature/order-system

2. 开发提交

git commit

3. 同步主分支

git checkout main
git pull

4. 合并 feature

git merge --no-ff feature/order-system

5. 删除 feature

git branch -d feature/order-system

十七、总结

git merge 是 Git 协作模型的核心。

它不仅是:

代码合并工具

更是:

团队开发历史管理机制

理解 merge 后,你会真正理解:

  • Git 分支模型
  • commit DAG
  • 团队协作
  • PR 工作流
  • rebase 与 merge 的区别

最后记住一句话:

merge 不是“复制代码”
而是“连接历史”

这才是 Git 最核心的思想。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐