在公司做项目,经常遇到这种情况:你和同事都在改同一个功能模块,各自在本地写完代码,准备推送到远程仓库。结果你一提交,系统提示“冲突”,再一看同事的提交记录,发现你们俩都动了同一段代码。这就是典型的远程提交冲突。
冲突是怎么发生的?
Git 工作流里,每个人都在自己的分支开发,最后合并到主干。当你执行 git push 时,Git 会检查远程分支的最新提交是否和你的基础版本一致。如果不一致,说明别人先你一步提交了改动,这时候直接推送会被拒绝,系统要求你先拉取并解决冲突。
比如你和同事都基于 commit A 开始工作,你改完提交为 B,他改完提交为 C。如果他先推送了 C,你再推 B,Git 就会告诉你:“不行,远程已经有新东西了,你得先合并 C 再提交。”
如何提前发现冲突?
别等到 push 的时候才被拦下来。可以在提交前先拉一下远程最新代码:
git fetch origin
git diff HEAD origin/main
这两条命令能让你看到本地和远程最新的差异。如果发现别人也改了你正在动的文件,就可以提前沟通,避免“撞车”后还得花时间协调。
实际场景:修复同一个 bug
上周我们组两个同事同时修一个登录页的 bug,都改了 login.js。一个加了验证码校验,另一个优化了错误提示。两人几乎同时提交,第二个人 push 时被拒,系统提示需要合并。
这时候就得执行:
git pull origin main
Git 会尝试自动合并,但如果两人都改了同一行代码,就会标记 conflict。打开文件能看到类似这样的内容:
<<<<<<< HEAD
// 我的代码:增加验证码验证
if (!code) return showError('请输入验证码');
=======
// 远程的代码:优化提示语
showError('登录失败,请检查输入');
>>>>>>> abc1234
这时候就得手动决定保留谁的逻辑,或者把两者结合起来。改完保存,再 git add 和 git commit,才算真正解决。
怎么减少这类问题?
定期同步远程状态很重要。建议养成习惯,在开始写代码前先 git pull,提交前再拉一次。也可以用 Git Hooks 在提交前自动检查差异。
另外,拆分任务要细一点。如果多个开发者总在同一文件上碰面,说明模块职责太集中,可以考虑重构,降低协作成本。
远程提交冲突检测不是技术难题,更多是协作节奏的问题。提前看一眼远程变化,往往就能省下半小时的合并麻烦。