一、先搞懂:Git 冲突产生根本原因
同一文件【同一代码行区间】,多人同时修改,并且先后提交到同一分支,合并时 Git 无法自动判断保留哪一份代码 → 产生冲突。
不同文件、同一文件不重叠行修改:不会冲突,Git 自动合并。
冲突常见场景:
git merge合并分支git pull(内部 = fetch + merge)git rebase变基GitHub/Gitee/GitLab PR/MR 线上合并
二、最佳实践:冲突【预防方案】(优先做,减少冲突)
1. 分支规范(最重要)
推荐标准协作流程 GitFlow / Trunk Based(主干开发)
方案 A:Trunk Based(中小型团队、敏捷,推荐)
main/master:受保护分支,禁止直接 push,只能通过 PR/MR 合并所有人从
main拉出短生命周期特性分支:feature/xxx、fix/bugxxx分支不要长期存在!尽量1~3 天内合并回主干
分支存放越久,和主干差异越大,冲突爆炸概率直线上升
方案 B:GitFlow(大型稳定项目、版本发布周期长)
main(生产)、develop(开发主干)、feature、release、hotfix
❌ 禁止陋习:多人共用一条长期不合并的开发分支
2. 日常开发规范
频繁拉取主干最新代码
bash
# 每天开工前、提交代码前执行
git checkout feature/xxx
git pull origin main
提前在本地解决冲突,不要堆积到线上 PR。
单次提交粒度小
一个 commit 只做一件事,不要一次改动几十个文件上千行;大范围修改极易碰撞冲突。
文件拆分、避免多人争抢同一个大文件
超大配置文件、单体 yaml、常量文件最容易冲突;拆分成多个模块文件
前端:不要所有人同时改同一个 vue 组件
Java:避免多人同时修改同一个实体类、同一个 Controller
约定代码区块所有权(团队约定)
简单规则:同一功能模块尽量指定主要维护人,减少多人同时修改同一文件。
禁止多人并行重构公共基础代码
重构公共类、工具类前,群内同步,错开时间开发。
3. 工具层面自动化防控
PR/MR 开启代码评审,CI 流水线自动编译、单元测试;提前发现合并后代码异常
主干分支开启保护:禁止强制推送
push -f,禁止直接 pushIDE 插件实时提示远端变更(IDEA、VSCode git 插件)
4. 编码层面小技巧
不要多行空行、不要随意格式化全部代码!
❗全员代码格式化标准必须统一(Prettier、Google Java Format、Spotless)
如果 A 用 Tab、B 用空格;一人保存自动格式化整个文件,每次合并必然全文件冲突!
三、冲突出现后:完整解决流程
前置知识点:冲突标记
打开冲突文件,Git 会自动插入标记
java
运行
<<<<<<< HEAD // 当前分支本地代码
String oldCode();
======= // 分割线
String newCode();
>>>>>>> feature/test // 拉取过来的远端代码
处理目标:删除冲突标记 <<<<<< ===== >>>>>>,保留正确代码
⚠️ 不要只删除标记不梳理业务代码!很多人合并完出现逻辑 bug。
场景 1:git pull /git merge 产生冲突(最常用)
bash
# 1. 拉代码触发冲突
git pull origin main
# 输出 Auto-merging xxx.java
# CONFLICT (content): Merge conflict in xxx.java
# Automatic merge failed; fix conflicts and then commit the result.
操作步骤
查看哪些文件冲突
bash
git status
带有 both modified 就是冲突文件
两种方式解决冲突
✅ 方式 1:IDE 图形化工具(推荐,新手首选)
IDEA / VSCode 内置 Merge 工具,左右对比,一键选择保留本地 / 远端 / 合并两者代码
VSCode:点击文件【Accept Current Change / Accept Incoming Change / Accept Both Changes / Compare Changes】
IDEA:弹出 Merge 窗口,可视化对比
✅ 方式 2:手动编辑文件(服务器无图形界面时使用)
打开冲突文件,清理标记,编写最终正确代码
冲突修复完成,加入暂存区
bash
git add 冲突文件名
# 或者全部 git add .
完成合并提交
bash
git commit
# 不需要额外写信息,git默认生成合并提交信息
推送远端
bash
git push
❗ 合并冲突中途想放弃,撤销本次合并
bash
git merge --abort
场景 2:git rebase 变基产生冲突(推荐优先 rebase,提交历史更干净)
很多团队要求:特性分支合并前先 rebase 主干,而不是 merge
bash
git checkout feature/demo
git rebase origin/main
# 出现冲突
rebase 冲突处理流程
修改冲突文件,解决冲突
添加到暂存区
bash
git add .
继续变基
bash
git rebase --continue
rebase 会逐个 commit 依次处理冲突,可能多次出现冲突,重复操作
中途放弃 rebase
git rebase --abort
重要提醒:已经推送到远端公共分支,不要随便执行 rebase + push -f,会导致其他人代码丢失!仅私有分支可使用。
场景 3:线上 PR/MR 冲突(Github/Gitee/GitLab 页面提示无法自动合并)
原因:远端主干在你创建分支后有新提交。
正确做法:本地处理冲突,不要在线上手动编辑!
拉取主干最新代码
本地切换特性分支,执行 merge main /rebase main
在本地解决冲突、提交、推送
页面自动刷新,冲突消失,即可发起合并
禁止直接网页编辑强行合并,极易产生隐藏逻辑 bug。
四、高频踩坑避坑清单
❌ 冲突直接无脑选择「全部保留远端」或「全部保留本地」
会丢代码!一定要逐处看懂两边改动含义。
❌ 代码格式化引发大规模虚假冲突
团队统一格式化配置,禁止随意全局格式化文件。
❌ 公共分支执行 rebase 后强制 push
git push --force非常危险,多人协作公共分支慎用,优先使用--force-with-lease
git push --force-with-lease
❌ 解决冲突后忘记删除冲突标记
代码直接编译报错,上线事故源头。
❌ 分支长期不合并,堆积上千行差异,冲突集中爆发
对策:小分支、短周期、频繁同步主干。
五、推荐日常标准工作流(直接复制落地)
# 1. 开发前同步主干最新代码
git checkout main
git pull
# 2. 创建/切换特性分支
git checkout feature/order-pay
# 3. 编码、多次本地提交
# ...开发代码...
git add .
git commit -m "实现支付下单逻辑"
# 4. 提交前再次同步主干,提前解决冲突(关键一步)
git fetch origin main
git rebase origin/main
# 如果出现冲突:解决冲突 → git add . → git rebase --continue
# 5. 推送远端特性分支,发起PR
git push origin feature/order-pay
六、扩展:配置可视化合并工具(可选)
如果你习惯命令行,可以配置 git mergetool 快速唤起 IDE 解决冲突
# 示例 IDEA mergetool 配置
git config --global mergetool.idea.cmd 'idea --merge $LOCAL $REMOTE $BASE $MERGED'
# 触发工具
git mergetool原文链接
欢迎访问 小易撩挨踢