在团队协作开发中,多人同时修改同一个文件是家常便饭。当你正准备把远程代码拉下来合并时,突然弹出一行提示:Automatic merge failed; fix conflicts and then commit the result.——冲突来了。
为什么会发生pull冲突?
简单说,就是你本地改了某行代码,别人也改了同一文件的同一部分,并且已经推到了远程仓库。你执行git pull时,Git 不知道该保留谁的修改,只能停下来让你手动决定。
比如你和同事都在修改index.js,你优化了一段登录逻辑,他调整了同一个函数的参数顺序。两个人的提交基于同一个旧版本,但改动重叠了,这时候pull就会报冲突。
看到冲突怎么办?先别慌
Git 会在冲突文件中标出冲突区域,长这样:
<<<<<<< HEAD
console.log("本地修改的内容");
=======
console.log("远程拉取的内容");
>>>>>>> 8f3a7b1c2d... 提交信息
其中<<<<<<< HEAD到=======之间是你的本地内容,=======到>>>>>>>之间是即将合并进来的远程内容。
手动解决冲突的步骤
打开标红的文件,找到冲突标记,根据业务逻辑决定保留哪边,或者融合两边。比如你发现远程改的是接口路径,而你改的是日志输出,那完全可以保留双方修改。
改完后,删掉所有冲突标记符(包括<<<<<<<、=======、>>>>>>>),保存文件。
接着把修改后的文件加入暂存区:
git add index.js
然后提交合并结果:
git commit -m "合并远程更新,解决登录模块冲突"
这时候再git push就没问题了。
用可视化工具更省心
命令行看冲突对新手不太友好。可以配置 Git 使用 VS Code、WebStorm 或 GitKraken 这类工具自动弹出对比界面。
比如在 VS Code 中,打开源代码管理面板,冲突文件会高亮显示,点击就能看到左右对比,点“接受当前”或“接受传入”快速选择,也能手动编辑。
配置方式也很简单:
git config --global core.editor "code --wait"
之后每次冲突,运行git mergetool就会调起编辑器处理。
预防胜于治疗
经常拉代码能减少大块冲突。建议每天开工第一件事就是git pull,避免积压太多本地修改。
另外,多人协作时尽量拆分功能模块,减少对同一文件的频繁修改。比如前端把公共组件抽离,后端按接口划分服务文件,从结构上降低撞车概率。
还有一点容易忽略:提交信息写清楚。当你看到“fix bug”这种模糊记录时,根本没法判断它动了哪块逻辑。写成“修复用户登录token过期跳转问题”才有助于后续排查冲突来源。