SVN 冲突解决全流程(2025 年最新、最清晰、最实用的实战指南)
1. 什么时候会产生冲突?
- 你和别人同时修改了同一文件的同一行(或相邻几行)
- 你修改了文件 A,别人删除了文件 A
- 你删除了文件 B,别人修改了文件 B
2. 冲突的 3 种类型与表现
| 类型 | 提示符号 | 说明 |
|---|---|---|
| 文本冲突(C) | C | 同一行内容被不同人修改 |
| 属性冲突 | C | 文件属性(如 svn:ignore、svn:eol-style)冲突 |
| 树冲突(Tree Conflict) | C | 文件/目录的增删改与别人操作冲突(最常见、最麻烦) |
3. 解决冲突的完整 6 步流程(99% 的情况都这么干)
# 第1步:先更新到最新版本(冲突通常在 update 或 merge 时出现)
svn update
# 看到类似:
# Conflict discovered in 'src/utils.cpp'.
# Select: (p) postpone, (df) diff-full, (r) resolved, ...
# 第2步:查看冲突内容(3个临时文件会自动生成)
svn diff src/utils.cpp
# 或者用工具看:
# Windows → TortoiseSVN → Right-click → Edit conflicts
# macOS → CornerStone / Versions / SnailSVN
# Linux → meld, kdiff3, vimdiff
SVN 会生成 4 个文件(以 utils.cpp 为例):
utils.cpp ← 当前工作副本(乱码版)
utils.cpp.mine ← 你本地的修改(没更新前)
utils.cpp.rOLD ← 旧版本(你修改前的基线)
utils.cpp.rNEW ← 服务器最新版本(别人提交的)
内容长这样:
<<<<<<< .mine
return calculateNewWay(data);
=======
return calculateFastWay(data); // by lisi
>>>>>>> .r1567
第3步:手动编辑文件,去掉<<<<<<< ======= >>>>>>> 标记,保留你想要的最终代码
第4步:标记为已解决(必须执行!否则不能 commit)
svn resolved src/utils.cpp # 老版本写法(1.8 以前)
# 或新版本(推荐,所有情况都适用)
svn resolve --accept working src/utils.cpp
第5步:常用的一键解决方式(根据场景选择)
# 场景1:直接用我的代码覆盖(我知道我是对的)
svn resolve --accept mine-full 冲突文件
# 场景2:直接用服务器最新的代码(我改错了,放弃本地)
svn resolve --accept theirs-full 冲突文件
# 场景3:已经手动编辑好了,告诉 SVN 我搞定了
svn resolve --accept working 冲突文件
# 场景4:批量解决当前目录所有冲突(小心使用!)
svn resolve --accept working -R .
第6步:提交
svn commit -m "fix conflict in utils.cpp"
4. 树冲突(Tree Conflict)最容易出错,重点讲解
常见树冲突场景及一键解决方法:
| 场景 | 提示 | 最快解决命令 |
|---|---|---|
| 你修改了文件,别人删了它 | local edit, incoming delete | svn resolve –accept theirs-full 文件 |
| 你删了文件,别人修改了它 | local delete, incoming edit | svn resolve –accept mine-full 文件(保留删除) |
| 你新增了文件,别人也新增同名文件 | local add, incoming add | 手动改名或合并内容后 resolve –accept working |
| 目录被别人删了,你在里面改了文件 | local edit, incoming delete | 通常回退或重新建目录 |
5. 推荐工具(彻底告别手改)
| 系统 | 推荐工具 | 操作方式 |
|---|---|---|
| Windows | TortoiseSVN | 右键 → Edit conflicts → 点 Merge |
| macOS | CornerStone、SnailSVN、Versions | 自动弹出三窗对比界面 |
| Linux | Meld、KDiff3、vimdiff | 配置 svn 的 merge-tool |
| 所有系统 | VS Code + SVN 插件 | 直接在编辑器里点按钮解决 |
6. 预防冲突的最佳实践(强烈建议团队遵守)
- 开发前先
svn update - 不要长时间不提交(超过 1 天就要 commit)
- 大改动先开分支(feature branch)
- 关键文件加锁机制(svn lock)—— 适用于二进制文件(如 .psd、.docx)
svn lock config.xml -m "editing"
掌握上面这套流程后,SVN 冲突就再也不是问题了,3 分钟内必解决。
如果你现在正卡在一个具体的冲突,
直接把 svn status 和 svn info 的输出贴出来(或者截个 TortoiseSVN 的冲突窗口),我 30 秒给你最精确的一句解决命令。