代码冲突Merge Conflict
你可能会说
拉取新版本后 Git 停下来说有冲突,我该打开哪个文件、改哪一段?
同一处内容被两条分支改成不同结果,Git 无法自动选择,需要人决定最后保留什么当两条分支在同一文件的同一处做了不同修改时,合并操作会暂停,Git 会把两边的改动同时写入冲突文件并加上标记,等待人工裁决。代码冲突不是系统故障,而是不同改动意图的正常碰撞;解决冲突时需要核对双方上下文,挑选或整合最终内容,彻底删掉冲突标记后再重新提交。
先知道
也常被叫作冲突Merge Conflict
什么时候用
- 按 git status 列出的文件,打开冲突文件搜索冲突标记$ git statusboth modified: index.html先打开这个文件,再搜索冲突标记
- 理解两边意图后保留正确内容,而不是任选一边两边各改了一部分,都需要保留时合并成一版<h1>小狸的摄影主页</h1><p>城市风景集</p>
- 删掉全部冲突标记(含 <<<<、======、>>>>)后再 git add 并提交$ git add index.html$ git commit[main 3f9c2ab] Merge branch feature/new-nav标记删净后才提交
- 解决后重新运行项目,确认两边功能都还在冲突已解决→打开页面→标题正确 ✓重新运行确认两边的改动都还在
什么时候不用
- 保留任何冲突标记就提交:这些标记不是可运行代码<<<<<<< HEAD标记留在文件里,页面无法解析
<h1>小狸的主页</h1> - 没有看懂另一边就整段删除:可能丢掉对方的修复对方刚修的标题 bug 一起被删掉
- 面对冲突直接 git merge --abort 放弃整个合并,改动全部丢在未合入状态git merge --abort→改动全部留在未合入状态
- 解决冲突时顺手改其他代码,让这次提交混杂无关改动解决标题冲突的同时改了样式和文案
组成结构 · Anatomy
<<<<<<< HEAD(main)
<h1>小狸的主页</h1>
=======
<h1>小狸的摄影主页</h1>
>>>>>>> feature/new-nav
HEAD 下面是你当前分支上这行的内容
这一整段属于你所在的分支,处理冲突时可以整段保留或删除
两版内容的分界,解决冲突时和标记一起删掉
被合进来的分支上这行的内容,可能是对方刚修的 bug
标出这段内容来自哪条分支,方便追溯
常见变体 · Variants
保留一版Keep one side
<h1>小狸的摄影主页</h1>
读懂两边后,只保留其中一版的正确内容
合并两版Combine both
<h1>小狸的摄影主页</h1><p>城市风景集</p>
两边各改了一部分,都需要保留时
放弃本次合并merge --abort
git merge --abort
冲突太复杂、需要先弄清情况时,回到合并前的状态
典型使用场景
终端合并冲突提示
$ git merge feature/new-nav
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
冲突文件里的标记
git status 列出冲突文件
$ git status
You have unmerged paths.
both modified: index.html
both modified 表示这个文件两边都改过,需要手动决定
解决后重新提交
$ git add index.html
$ git commit
[main 3f9c2ab] Merge branch feature/new-nav
冲突标记已全部删除,合并完成
延伸阅读 · 权威出处
