git merge 冲突怎么解决?一篇讲透合并冲突的 4 个步骤
两个人改了同一文件同一行、git merge 报 conflict,怎么办?本文用真实例子带你走完「看冲突→选版本→标记解决→提交」的完整流程。
合并冲突是 Git 新手最怕、但完全可掌握的场景。它本质是:同一文件的同一位置被两处不同改动改了,Git 不知道该听谁的,于是交给你决定。
先看冲突长什么样
执行合并后出现提示:
Auto-merging 文件.txt
CONFLICT (content): Merge conflict in 文件.txt
Automatic merge failed; fix conflicts and then commit the result.
打开冲突文件,你会看到 Git 留下的标记:
<<<<<<< HEAD
这是你当前分支的版本
=======
这是被合并进来分支的版本
>>>>>>> feature/新功能
<<<<<<< HEAD 到 ======= 之间是你这边的,======= 到 >>>>>>> 是对方分支的。
四步解决冲突
第 1 步:定位冲突文件
git status
会列出所有 both modified(双方都改过)的文件,这些就是冲突源。
第 2 步:逐个打开,选择保留内容
打开每个冲突文件,决定每一处 <<<<<<< 区块该留哪个:
- 只要自己的 → 删掉对方那段和标记
- 只要对方的 → 删掉自己那段和标记
- 两者都要 → 手动把两段按顺序合并,只删标记
第 3 步:标记为已解决
改完保存后,把文件加入暂存区,告诉 Git「这个冲突处理好了」:
git add 文件.txt
第 4 步:完成合并提交
所有冲突文件都 add 后,提交:
git commit
Git 会用默认的合并信息,直接保存即可。合并到此完成。
更快:用 IDE 或三方工具
用 VS Code、WebStorm 等打开冲突文件,界面上会有「Accept Current / Accept Incoming / Accept Both」按钮,可视化选择,比手改标记直观得多。命令行重度用户可配置:
git config --global merge.tool vimdiff
git mergetool
常见疑问
- 冲突时想放弃合并 →
git merge --abort(回到合并前) - 冲突会不会丢代码 → 不会,只要不误删,所有内容都在标记里
- 怎么减少冲突 → 保持分支短小、勤 pull、多人少改同一区域
一句话速记
定位(git status)→ 选择(编辑标记区块)→ 标记(git add)→ 提交(git commit)。
?
常见问题 FAQ
冲突会不会导致我的代码丢失?
不会。冲突时双方改动都在文件里,只是被 <<<<<<< ======= >>>>>>> 标记隔开,git add 和 commit 前不会丢。只要不误删内容或强推即可。
冲突太多、想放弃这次合并怎么办?
用 git merge --abort 即可回到合并前的状态,所有未提交的合并改动都会被清除,安全。
git merge 和 git rebase 解决冲突方式一样吗?
冲突解决的编辑步骤一样,但 merge 会保留一个合并提交、历史有分叉;rebase 会把你的提交重放到目标分支顶端、历史线性,通常冲突处理略有不同(rebase 冲突用 git rebase --continue)。
为什么明明没怎么改还是会冲突?
只要两个人改了同一文件的同一行(或同一处逻辑),即使改动很小也可能冲突。保持分支短小、勤 pull 可减少冲突。