主题
第 9 章 冲突不可怕 · 亲手拆一次"炸弹"
冲突(Conflict)的发生条件只有一个,两边改了同一处,Git 不敢替你们做主。本地和网页各改了 README 的同一行,你的分支和 main 动了同一个函数,你和 AI 一人一版,都会触发。合并或 pull 时,Git 停下来,把球踢给你。
它的样子第一次见很吓人,看懂了就只是个填空题。冲突的文件里会出现这样的标记。
<<<<<<< HEAD
你这边的版本
=======
对方那边的版本
>>>>>>> feat-search翻译过来就是 Git 在摊手:"上面是你的,下面是他的,你俩自己挑。"拆弹三步。一,做决定,留你的,留对方的,或者动手把两边融成一版。二,删标记,那三行 <<< === >>> 是 Git 的便签,决定完必须删干净。三,收尾,保存、add、commit,冲突解除。VS Code 会把冲突高亮并给出"采用哪边"的快捷选项,点起来更省事,但原始标记必须看得懂,AI 解决冲突时,日志里出现的就是这些原文。
说到让 AI 解冲突,可以,但你要审一件事,两边的意图是否都活了下来。AI 最容易犯的错,是为了让冲突标记消失而随手丢掉一边的改动,页面上干干净净,功能却少了一块。审查时别只看标记删没删,要看两边原本想做的事是否都还在。
最后是预防,三个习惯让冲突几乎绝迹。动手前先 pull,第 6 章的终生习惯。小步提交,勤推送,别攒一大包。分支短命,开了尽快合,拖得越久和 main 的分歧越大。
关键领悟
冲突是 Git 在保护你,它宁可停下来问,也不敢替你猜。拆过一次弹的人,从此不怕这三行标记。
试一试
在 playground 里自造一次冲突,网页上改某行,本地改同一行并 commit,然后 git pull,亲手把它拆掉。