【Git】merge 分类
在 Git 里,merge
的本质是把两个分支的历史合并到一起。常见的合并方式主要有以下几种:
🔹 1. Fast-forward Merge(快进合并)
特点
- 当目标分支落后于当前分支,且没有新的分叉时,可以直接把指针“快进”到目标分支的最新提交。
- 历史是 线性的,不会生成新的合并提交。
命令示例
git checkout main
git merge feature
如果 main
没有新的提交,就会直接快进。
适用场景
- 分支未分叉,保持历史干净。
- 小功能分支合并时常用。
🔹 2. 3-way Merge(三方合并)
特点
- 当两个分支有分叉时,Git 会找到 共同祖先(merge base),再把三个提交(
base
、ours
、theirs
)进行合并。 - 会生成一个新的 merge commit。
命令示例
git checkout main
git merge feature
如果 main
和 feature
都有新的提交,就会触发三方合并。
适用场景
- 分支开发时保留完整的历史轨迹。
- 团队协作时更常用。
🔹 3. No Fast-forward Merge(禁止快进合并)
特点
- 即使可以快进,Git 也会强制生成一个 merge commit,从而保留分支合并点。
命令示例
git checkout main
git merge --no-ff feature
适用场景
- 团队协作时希望明确看到功能分支的合并记录。
- 有利于代码审查和回溯。
🔹 4. Squash Merge(压缩合并)
特点
- 把分支上的多个提交 压缩成一个提交,然后合并到目标分支。
- 历史更干净,但不保留分支的详细提交记录。
命令示例
git checkout main
git merge --squash feature
git commit -m "feat: add feature"
适用场景
- 功能分支提交很多,但合并到主干时只想保留一个提交。
- 提交历史要求简洁。
🔹 5. Octopus Merge(章鱼合并)
特点
- 一次合并多个分支(多于两个)。
- 不适合有冲突的复杂场景。
命令示例
git checkout main
git merge feature1 feature2 feature3
适用场景
- 合并多个无冲突的分支。
- 一般在自动化脚本中才会用。
✅ 总结表格
类型 | 是否生成新提交 | 是否保留分支历史 | 适用场景 |
---|---|---|---|
Fast-forward | ❌ 否 | ❌ 否(线性历史) | 简单合并,分支未分叉 |
3-way merge | ✅ 是 | ✅ 是 | 团队协作,保留历史 |
No-ff merge | ✅ 是 | ✅ 是 | 保留分支合并点 |
Squash merge | ✅ 是(压缩) | ❌ 否 | 保持历史干净 |
Octopus merge | ✅ 是 | ✅ 是 | 一次合并多个分支 |