【SVN多用户开发】代码冲突&解决办法
SVN是一款集中式的代码存储工具,可以帮助多个用户协同开发同一应用程序。 但是SVN不能完全代替人工操作,有时也需要程序员自己进行沟通确认有效的代码。 下面就简单的看一下,常见的代码冲突以及解决方法。 总结起来,无非是: 1 避免开发人员共同开发同一文件 2 开发前需要时常更新本地代码库
修改同一文件不同位置引发的冲突
首先看一下问题背景:
样例场景中有连个用户:xingoo和test。他们共同开发一个程序,改程序只有一个文件,原始的代码如下:
public void Test{
System.out.println("Test!");
return 1;
}
此时用户xingoo,修改代码第2行,修改打印语句!
public void Test{
System.out.println("Test!xingoo");
return 1;
}
用户test,修改代码第3行,修改返回值
public void Test{
System.out.println("Test!");
return 0;
}
此时xingoo用户先提交了代码,当test提交代码时,提示错误:
提示用户该文件已经过期,需要先更新文件。
此时,SVN会自动把其他用户修改的操作更新到该文件中(前提是不同用户修改的位置不同),并且保存当前用户修改的部分。
点击更新,更新代码。
观察代码发现,已经更新为:
public void Test{
System.out.println("Test!xingoo");
return 0;
}
再次提交,提示成功:
这种情况,是最简单的代码冲突样例。不同用户修改了不同位置的代码,因此只需要在提交前进行更新,就可以解决冲突。
那么如果用户修改的是同一位置呢?
修改同一文件相同位置引发的冲突
前面例子中,xingoo的代码当前为,版本号为9:
public void Test{
System.out.println("Test!xingoo");
return 1;
}
test的代码为,版本号为10:
public void Test{
System.out.println("Test!xingoo");
return 0;
}
此时test的代码时最新版本的。
如果此时,xingoo用户,想要修改 return 1; 部分的代码,提交时会发生什么呢?
再次提交遇到错误:
点击OK后,提示更新或取消,点击更新,更新代码!
再次报错,提示:文件存在冲突!
此时观察文件夹发现,多了3个文件
分别打开这3个文件:
test.txt中的内容,该文件记录了冲突的详细内容,
其中<<<<<<.mine到====之间为当前用户修改的内容;
====到>>>>>.r10为版本库中的内容:
public void Test{
System.out.println("Test!xingoo");
<<<<<<< .mine
return 2;
=======
return 0;
>>>>>>> .r10
}
test.txt.mine 记录当前用户修改后的文件内容快照
public void Test{
System.out.println("Test!xingoo");
return 2;
}
test.txt.r9 记录当前用户修改前,版本库中的内容快照
public void Test{
System.out.println("Test!xingoo");
return 1;
}
test.txt.r10 记录当前版本库中内容快照
public void Test{
System.out.println("Test!xingoo");
return 0;
}
通过这四个文件就可以很快速的发现,哪里有冲突。
至于如何修改,这里推荐:
直接拷贝mine文件,然后把r10文件的r10后缀去掉,进行更新。更新后,对比mine中的内容在进行修改。
也可以直接与其他人员进行协商沟通;更新版本库中的内容。
通过TortoiseSVN进行代码对比
有时候,需要对比文件的历史修改内容,可以直接在该文件上右键,选择Diff
该操作会自动对比代码库中文件的内容。
通过TortoiseSVN进行版本对比
也可以通过查看文件的历史版本,来对比代码:
选择Show log菜单
在弹出对话框中,上面列出最近的几个版本;可以直接双击下方蓝色的文件名称,就可以直接使当前文件与该版本的文件进行对比。
参考
【1】《版本控制之道》
【2】慕课网,SVN版本控制:http://www.imooc.com/learn/109
- Vjios P1736 铺地毯【暴力,思维】
- Vijos P1116 一元三次方程求解【多解,暴力,二分】
- Python Selenium设计模式-POM
- [快学Python3]HTTP处理 - urllib模块
- Vijos P1786 质因数分解【暴力】
- 模仿百度新闻列表底部的“加载更多”
- Vijos P1035 贪婪的送礼者【模拟】
- Vijos P1114 FBI树【DFS模拟,二叉树入门】
- Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】
- 撞库扫号防范
- 分享一个 HTTPS A+ 的 nginx 配置
- Vijos P1785 同学排序【模拟】
- Vijos P1784 数字统计【模拟】
- 网络安全黑暗森林法则:2015 ISC 深度回顾
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Netty之旅二:口口相传的高性能Netty到底是什么?
- 前端知识复习(一)
- Powershell运行脚本报错:此系统上禁止运行脚本
- git rebase解决合并冲突
- npm相关操作
- Angular html property的值如何被更新的
- Centos 7 使用mailx发送邮件
- Centos 7 备份MySQL
- Centos 7 备份MySQL/MongoDB并发邮件脚本
- Nginx启动报错:sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object
- 有赞美业店铺装修前端解决方案
- nginx部署react项目
- Golang 标准库 限流器 time/rate 设计与实现
- Node搭建简易的UDP服务器
- cordova run android 下载gradle报timeout