代码冲突Merge Conflict

你可能会说

拉取新版本后 Git 停下来说有冲突,我该打开哪个文件、改哪一段?

两边改动无法自动合并时,Git 会暂停并标出需要人判断的内容合并 main 和 feature/new-nav 时,如果双方把 index.html 的同一处标题改成了不同文字,Git 会在文件里留下两版内容和冲突标记,暂停完成合并。先结合页面上下文理解两边改动,再保留合适的标题,同时留下对方新增且仍需要的导航;删除标记并完成合并后,重新打开页面确认结果。冲突标记本身不会告诉你哪一边正确。
先知道
也常被叫作冲突Merge Conflict
标题冲突 · index.html
<<<<<<< HEAD (main) <h1>小狸的主页</h1> ====== <h1>小狸的摄影主页</h1> >>>>>>> feature/new-nav
标记外仍要检查feature 导航 · main 联系内容
解决后的 index.html
<nav>作品 关于</nav> <h1>小狸的摄影主页</h1> <p>联系小狸</p>
my-first-page.example

小狸的摄影主页

联系小狸

标记删除后,页面显示最终标题;feature 新增的导航和 main 原有联系内容都还在。

什么时候用

  • 按 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
冲突太复杂、需要先弄清情况时,回到合并前的状态
典型使用场景
合并暂停
zsh — my-first-page
$ git merge feature/new-navAuto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.
文件中的标题标记与两边改动
index.html · 标题冲突1 处需要处理
<nav>作品 关于</nav> ← feature/new-nav 新增
<<<<<<< HEAD (main)
<h1>小狸的主页</h1>
=======
<h1>小狸的摄影主页</h1>
>>>>>>> feature/new-nav
<p>联系小狸</p> ← main 上原有内容

冲突区包住两个标题版本;导航在标记外,也要确认并保留。

查看状态和分支上下文
zsh — my-first-page
$ git statusYou have unmerged paths.both modified: index.html$ git diff -- index.htmlmain: 原标题和联系内容feature/new-nav: 摄影标题和新增导航
最终文件与页面标题
解决后的 index.html · 合并提交已完成
<nav>作品 关于</nav> <h1>小狸的摄影主页</h1> <p>联系小狸</p> [main 3f9c2ab] Merge branch feature/new-nav
my-first-page.example

小狸的摄影主页

联系小狸

标记已删除;页面显示最终标题,feature 分支新增的导航和 main 原有联系内容都保留。

延伸阅读 · 权威出处