1. 当代码"打架"时会发生什么?
(场景描述:两位开发者在不同分支修改同一文件的相同位置)
# 创建新功能分支
git checkout -b feature/login
# 在login.py文件添加登录日志功能
echo "def login_log(user):" >> login.py
echo " print(f'{user}登录成功')" >> login.py
git commit -am "添加登录日志功能"
# 切换回主分支修改同一文件
git checkout main
sed -i '' '1i # 用户认证模块v2' login.py
git commit -am "添加模块注释"
现在执行合并:
git merge feature/login
控制台会显示:
CONFLICT (content): Merge conflict in login.py
Automatic merge failed; fix conflicts and then commit the result.
2. 三招化解冲突危机
2.1 可视化工具实战
(使用VS Code的图形化合并工具)
冲突文件会显示:
<<<<<<< HEAD
# 用户认证模块v2
=======
def login_log(user):
print(f'{user}登录成功')
>>>>>>> feature/login
操作步骤:
- 点击"Accept Current Change"保留主分支修改
- 点击"Accept Incoming Change"保留功能分支代码
- 手动调整合并后的代码顺序
2.2 命令行大师操作
(适合远程服务器环境)
# 查看冲突文件列表
git status
# 使用nano编辑器手动解决
nano login.py
# 标记解决完成
git add login.py
# 完成合并提交
git commit -m "合并登录日志功能,解决模块注释冲突"
2.3 高阶玩家秘籍:rerere
(重用已记录的解决方案)
# 启用rerere功能
git config --global rerere.enabled true
# 首次解决冲突后...
git add login.py
git commit
# 当相同冲突再次出现时
git merge other-branch # 自动应用之前的解决方案
3. 必知的合并策略大全
3.1 合并与变基的抉择
(项目历史记录维护案例)
# 合并操作(保留完整历史)
git checkout main
git merge feature/payment --no-ff
# 变基操作(整理提交历史)
git checkout feature/payment
git rebase main
3.2 精确打击:部分合并
(只需某个文件的修改)
git checkout main
git checkout feature/chat -- utils/validator.py
git commit -m "合并聊天功能的验证器模块"
4. 防冲突的武功心法
(团队协作规范示例)
# 配置预提交钩子
#!/bin/sh
# .git/hooks/pre-commit
git pull --rebase
npm run test
5. 不同场景的解决方案矩阵
冲突场景 | 推荐方案 | 耗时预估 |
---|---|---|
简单文本冲突 | 编辑器手动合并 | 5分钟 |
多文件结构化冲突 | 使用IDE合并工具 | 15-30分钟 |
持续集成环境冲突 | 命令行快速处理 | 10分钟 |
重复性冲突 | 启用rerere功能 | 2分钟 |
6. 技术方案深度解析
6.1 合并策略对比
- 递归合并(默认):适合大多数情况,自动处理公共祖先
- ours/theirs策略:紧急情况下保留指定分支版本
- 子模块处理:适合包含第三方库更新的场景
6.2 冲突预防体系
- 每日晨会同步开发进度
- 功能开关控制未完成代码
- 自动化测试覆盖率监控
- 模块化代码设计规范
7. 血的教训:避坑指南
(来自真实项目案例)
# 错误示范:强制推送覆盖冲突
git push -f origin main # 导致团队其他成员代码丢失
# 正确做法:
git pull --rebase
git push
8. 未来战场:智能合并展望
(AI辅助冲突解决原型)
# 伪代码示例:基于语义分析的合并算法
def smart_merge(file_a, file_b):
ast_a = parse_ast(file_a)
ast_b = parse_ast(file_b)
if detect_semantic_conflict(ast_a, ast_b):
return generate_solution(ast_a, ast_b)
else:
return auto_combine_changes(file_a, file_b)