在多人协作开发中,Git 合并(merge)是非常高频的操作。但只要涉及多人修改同一份代码,就很容易遇到一个问题:冲突(Conflict)。
本文将系统讲清 Git 合并的几种方式、冲突是怎么产生的、如何解决冲突,以及如何尽量减少冲突。
合并与冲突常用命令#
| 操作 | 命令 |
|---|---|
| 合并分支 | git merge 分支名 |
| Fast-forward 合并(默认) | git merge 分支名 |
| 创建合并提交 | git merge --no-ff 分支名 |
1. 什么是合并分支?#
Git 合并(merge)是指把一个分支的代码变化,整合到另一个分支中。
例如:
feature/login → main表示把登录功能分支的代码合并到主分支。
常见场景:
- 功能开发完成合并到 main
- bugfix 修复合并回开发分支
- release 分支合并上线
合并的本质是:把两个分支的提交历史整合到一起。
2. Fast-forward 合并#
如果主分支在功能分支创建后没有新提交,Git 可能直接把主分支指针向前移动。
这种方式称为 Fast-forward。
示例:
A---B main
\
C---D feature/login合并后:
A---B---C---D mainFast-forward 的特点:
- 不产生 merge commit
- 历史是线性的
- 简洁,但不适合复杂协作
3. 创建合并提交#
如果两个分支都产生了新提交,Git 通常会创建一个新的合并提交(merge commit)。
A---B---C------M main
\ /
D---E--F feature/login
# M 是 merge commit,表示一次完整的合并记录。可以使用:
git merge --no-ff feature/login明确要求创建合并提交。
4. 为什么会产生冲突?#
冲突的本质是:
两个分支修改了同一文件的同一位置
例如:
main: hello world
feature: hello GitGit 不知道该保留哪个版本,就会报冲突。
5. 冲突标记#
当发生冲突时,文件中会出现:
<<<<<<< HEAD
hello world
=======
hello Git
>>>>>>> feature/login含义:
HEAD:当前分支内容=======:分隔线feature/login:要合并进来的内容
6. 解决冲突的方法#
手动修改为最终需要的内容:
hello Git删除所有冲突标记后执行:
git add 冲突文件
git commit也可以填写明确说明:
git commit -m ""7. 查看冲突文件#
# 查看冲突文件状态
git status
# 查看冲突来源
git diff
# 只查看未合并冲突文件
git diff --name-only --diff-filter=U8. 取消合并#
# 恢复到合并开始前的状态
git merge --abort9. 减少冲突的方法#
- 开始开发前同步最新代码
git pull; - 功能分支不要长期存在;
- 一个分支只负责一个明确功能;
- 避免多人修改同一文件的同一位置;
- 及时提交和推送;
- 大规模重构前提前沟通;
- 提交合并请求前同步目标分支。