代码冲突Merge Conflict

你可能会说

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

同一处内容被两条分支改成不同结果,Git 无法自动选择,需要人决定最后保留什么当两条分支在同一文件的同一处做了不同修改时,合并操作会暂停,Git 会把两边的改动同时写入冲突文件并加上标记,等待人工裁决。代码冲突不是系统故障,而是不同改动意图的正常碰撞;解决冲突时需要核对双方上下文,挑选或整合最终内容,彻底删掉冲突标记后再重新提交。
先知道
也常被叫作冲突Merge Conflict
<<<<<<< HEAD(main) <h1>小狸的主页</h1> ======= <h1>小狸的摄影主页</h1> >>>>>>> feature/new-nav
git status

两边改了同一行标题,Git 把两版都写进文件等你选。打开冲突文件,删掉不用的版本和标记,保留最终内容,再 git add 和 git commit。

什么时候用

  • 按 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
冲突太复杂、需要先弄清情况时,回到合并前的状态
典型使用场景
终端合并冲突提示
zsh — my-first-page
$ 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.
冲突文件里的标记
📄 index.html⚠ 1 处冲突
<<<<<<< HEAD(主线)
<h1>小狸的主页</h1>
=======
<h1>小狸的摄影主页</h1>
>>>>>>> feature/new-nav(分支)
先看两边各改了什么,再决定保留哪一版
git status 列出冲突文件
zsh — my-first-page
$ git status You have unmerged paths.   both modified: index.html both modified 表示这个文件两边都改过,需要手动决定
解决后重新提交
zsh — my-first-page
$ git add index.html $ git commit [main 3f9c2ab] Merge branch feature/new-nav 冲突标记已全部删除,合并完成
延伸阅读 · 权威出处