合并冲突是怎么发生的
在团队协作开发中,你和同事同时修改了同一个文件的同一段代码,当你尝试把对方的改动合并到自己的分支时,Git 无法自动判断该保留谁的版本,这时候就会提示“合并冲突”。这就像两个人同时改了一份合同,条款不一致,必须人工确认以哪个为准。
比如你正在开发登录功能,修改了 login.js 中的验证逻辑,而同事也在同个文件里调整了错误提示方式。你们各自提交后,执行 git merge feature/login-ui,终端弹出冲突警告,项目里对应文件会看到类似下面的标记:
<<<<<<< HEAD
your code here
=======
their code here
>>>>>>> branch-name怎么看懂冲突标记
上面那段特殊符号是 Git 插入的冲突分隔符。其中 <<<<<<< HEAD 到 ======= 之间是你当前分支的代码,也就是你本地的修改;从 ======= 到 >>>>>>> 是要合并进来的别人代码。你需要决定保留哪部分,或者把两者合理整合。
举个实际例子:你在本地添加了手机号校验:
if (!phone.match(/1[3-9]\d{9}/)) {
alert('请输入正确的手机号');
}而同事加了空值检查:
if (!phone) {
alert('手机号不能为空');
}两个逻辑其实不冲突,正确做法是把两段都保留,顺序上先判空再校验格式。
手动解决冲突的步骤
打开报冲突的文件,找到分隔符区域,删掉 Git 的标记行,然后根据业务需求整理最终代码。比如改成:
if (!phone) {
alert('手机号不能为空');
} else if (!phone.match(/1[3-9]\d{9}/)) {
alert('请输入正确的手机号');
}保存文件后,在终端执行 git add login.js 将其标记为已解决,接着运行 git commit,Git 会自动生成一条默认提交信息,也可以用 -m 参数自定义。提交完成后,这次合并就算完成了。
用编辑器辅助处理
很多人不用命令行直接看文件,而是借助 VS Code 这类工具。VS Code 在顶部会有“Accept Current Change”“Accept Incoming Change”“Accept Both”等按钮,点一下就能快速选择保留哪边,适合不太熟悉语法结构的新手。
WebStorm 或 SourceTree 则提供三窗格对比视图,左边是你当前的,右边是对方的,中间是合并结果,拖动或点击即可同步内容,视觉上更清晰。
避免频繁冲突的小技巧
最有效的办法是勤拉远程更新。每天开工前执行一次 git pull origin main,把自己的主干保持最新,减少后期大范围差异。
另一个建议是拆小功能模块。别一个人闷头写三天再提交,那样积压的改动越多,撞车概率越大。尽量做到每完成一个小功能就推一次,让合并粒度变细。
还有就是约定好公共文件的修改规则。比如大家都改 config.js,可以规定新增配置只能追加在末尾,不能插在中间,降低行号冲突几率。
不小心搞乱了怎么办
如果改着改着发现越理越乱,可以直接放弃当前合并操作。运行 git merge --abort,Git 会把你拉回合并前的状态,所有文件恢复如初,就像什么都没发生过。然后再重新拉一遍代码,冷静分析怎么合更稳妥。