代码冲突Merge Conflict
你可能会说
拉取新版本后 Git 停下来说有冲突,我该打开哪个文件、改哪一段?
两边改动无法自动合并时,Git 会暂停并标出需要人判断的内容合并 main 和 feature/new-nav 时,如果双方把 index.html 的同一处标题改成了不同文字,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 下面是你当前分支上这行的内容
这部分来自当前分支;来源标记不代表整段都该保留,先结合页面用途判断
两版内容的分界,解决冲突时和标记一起删掉
这部分来自被合入的分支;先看改动用途,来源标记不代表它对或错
标出这段内容来自哪条分支,方便追溯
常见变体 · Variants
采用一边的必要内容Use needed content from one side
<h1>小狸的摄影主页</h1>
确认一边的改动不再需要后,才删除对应内容
合并两版Combine both
<h1>小狸的摄影主页</h1><p>城市风景集</p>
把两边仍有用的内容整理成符合当前页面需求的结果
放弃本次合并merge --abort
git merge --abort
冲突太复杂、需要先弄清情况时,回到合并前的状态
典型使用场景
合并暂停
$ git merge feature/new-navAuto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.
文件中的标题标记与两边改动
<nav>作品 关于</nav> ← feature/new-nav 新增
<<<<<<< HEAD (main)
<h1>小狸的主页</h1>
=======
<h1>小狸的摄影主页</h1>
>>>>>>> feature/new-nav
<p>联系小狸</p> ← main 上原有内容
冲突区包住两个标题版本;导航在标记外,也要确认并保留。
查看状态和分支上下文
$ git statusYou have unmerged paths.both modified: index.html$ git diff -- index.htmlmain: 原标题和联系内容feature/new-nav: 摄影标题和新增导航
最终文件与页面标题
<nav>作品 关于</nav>
<h1>小狸的摄影主页</h1>
<p>联系小狸</p>
[main 3f9c2ab] Merge branch feature/new-nav
小狸的摄影主页
联系小狸
标记已删除;页面显示最终标题,feature 分支新增的导航和 main 原有联系内容都保留。
延伸阅读 · 权威出处
