文章目录
当代码相爱相杀时(真实案例预警!)
上周五下午5点29分,我正准备提交代码下班时——"git push"突然报出CONFLICT警告!我的登录模块和小王刚合并的用户中心模块在User.java文件里打起来了。更崩溃的是,这个文件里有23处冲突标记,连方法签名都被改得面目全非(救命啊!!!)
这种场景每个程序员至少会遇到17.8次。别慌!我们先来搞懂冲突的底层逻辑:
![冲突场景示意图]
(注:此处应有手绘流程图,展示两个分支对同一文件的修改路径)
一、冲突预防三件套(超实用!)
- 高频拉取:每次开工前先
git pull --rebase
(重要程度⭐⭐⭐⭐⭐) - 原子提交:把功能拆成小颗粒度提交(比如"登录模块-前端验证"和"登录模块-后端接口"分开)
- 分支策略:
- 主分支:master(生产环境)
- 开发分支:dev(日常开发)
- 功能分支:feature/xxx(单个功能开发)
# 推荐工作流示例
git checkout -b feature/user-auth
# 开发完成后...
git rebase dev # 在合并前先变基
二、冲突解决五步绝杀(手把手教学)
1. 定位战场
执行git status
看到如下提示:
Unmerged paths:
both modified: src/main/java/com/example/User.java
此时文件里会出现典型的冲突标记:
<<<<<<< HEAD
public void login(String username, String password) {
=======
public boolean login(String username, String password) {
>>>>>>> feature/user-center
(看到这个别慌!深呼吸三次)
2. 选择你的武器
- 命令行派:vim直接开干(适合Linux老炮)
- IDE党:
- VS Code的冲突解决界面(超直观!)
- IntelliJ的三向对比工具(带祖先版本)
- 可视化工具:
- Meld(跨平台神器)
- Beyond Compare(文件对比天花板)
3. 灵魂三问定乾坤
处理每个冲突点时都要问:
- 这个修改的业务逻辑是什么?
- 两个版本是否都能保留?
- 是否需要找原作者确认?
(真实案例:我曾把同事的权限校验当冲突代码删了,导致线上事故…)
4. 标记和平协议
解决完所有冲突后:
git add User.java # 标记冲突已解决
git rebase --continue # 继续变基流程
或者
git commit -m "Merge conflict: integrate user modules"
5. 终极验证(超级重要!!)
- 跑单元测试:
mvn test
- 启动本地服务验证
- 在测试环境做回归测试
三、高阶技巧大揭秘
1. 合并策略选择
策略 | 适用场景 | 命令示例 |
---|---|---|
recursive | 默认策略 | git merge -Xours |
octopus | 多分支合并 | git merge branch1 branch2 |
subtree | 合并子项目 | git merge -s subtree |
(表格:不同合并策略对比)
2. 后悔药套餐
- 取消合并:
git merge --abort
- 重置到合并前:
git reset --hard ORIG_HEAD
- 查看合并历史:
git reflog show --merge
3. 配置自动武器
在.gitconfig里添加:
[merge]
tool = vimdiff
[mergetool]
keepBackup = false
(这样就能用vimdiff可视化解决冲突啦)
四、血泪教训总结
- 别在周五下午合并代码(除非你想体验周末加班)
- 冲突解决后立即测试(别相信"我就改了一行"的鬼话)
- 使用.gitattributes文件 定义合并策略:
*.json merge=union
*.lock binary
最后送上我的保命口诀:
合并之前先拉取,
小步提交别攒聚。
冲突解决要沟通,
测试通过再继续!
下次遇到冲突时,记得先给自己倒杯咖啡,然后优雅地打开IDE——你现在已经是冲突解决大师了!(笑)