作用:
防止代码丢失(本地删除了找不到)
行为受到控制(不能动别人代码)。
不同人之间代码的相互调用,且不会产生冲突
安装
服务器端:
服务器端配置时是有提供一个URL的。这个URL是客户端链接服务器时用的:
项目Test的仓库的地址
然后服务器端要配置用户和密码,用户才能在客户端使用:
客户端
安装后右键会出现:
SVN Checkout 是第一次链接服务器时用的,点击后:
如要链接项目Test,在服务器端点击Test,出现的是项目Test的URL地址。
把这个地址填写在Checkout 里。注意客户端和服务器不是同一台机器时,地址里的计算机名DADI-PC(服务器的计算机名)要换成服务器的ip地址。
443是端口号,是服务器端安装时设置的。
本地磁盘的存放路径:
设置完之后点击OK,第一次链接会出现下面的界面:
点击上面这个下次就不会出现了
然后输入用户名,密码:
注意选中下面 的 Save.... 下次不用再次输入。
本地磁盘里就多出了项目文件夹。里面有一个文件夹.svn。有这个文件夹,Test项目文件夹才能跟服务器端进行svn操作(增删改查等)
基本操作
提交操作
新增文件(是自己拷贝到或者在这个Test创建的文件),然后提交:
新建的文件,还没有提交,会有一个问号:
如Test 文件夹下有一个Test.java文件,在Test文件夹下右键---点击SVN Commit:
上面是写注释的地方,每次提交都写注释,写明自己为什么修改代码,防止有争论时忘记自己当时为什么修改,修改了哪里。
选中要提交的文件,但是点击 OK。就提交了。
所有的操作都是点击 OK 后 就完成了。(删除也是,更新也是,所以要注意,别不小心就删除了,或者更新把本地覆盖了。虽然SVN也可以再找回来,但是毕竟麻烦)
Status是状态:
non-versioned 无版本 说明是第一次新建项目,还没提交到服务器。
missing 是要删除时的状态
modified 修改后待提交
提交后的文件,有一个对勾:
删除操作
本地删除文件后,服务器端还是有的,操作同上。需要在Test文件夹下右键---点击SVN Commit:
missing说明是要删除的文件,选中---OK。服务器端也就删除了。
修改文件
修改后待提交的文件,是一个感叹号:
这一块区域显示的是,上次提交后,又有了变化的文件(修改了,新建的,删除的等等),需要再次提交的文件
常见问题
多个用户操作同一个文件
(1)B修改了A的代码
如A提交一个文件,然后被B修改了。等A要用时,一个update更新,发现代码不是自己原来提交的了,自己写的部分被修改了。
只有当前代码是最新版本,才能进行提交操作(要不你代码已经是很久以前的了,想提交进去直接覆盖最新的版本,你都不是在最新版本上修改的,谁知道你的代码有没有问题)。所以每天早晨第一件事就是更新代码。晚上最后一步是提交代码。
当A早晨更新代码时,发现自己的代码被修改了:
(这个Updated就是代码有修改的意思吗?)
如何找回代码,如何知道是谁修改了代码?
右击文件----TortoiseSVN ---Show log:
可以看到代码提交记录:
加号的是新建的意思,感叹号就是修改了的意思。可以看到谁在什么时间进行了什么操作。(如果提交时有些注释,Message里会显示)
然后点击要恢复的版本---选择恢复到此版本:
点击 Revert:
本地代码恢复(仍需要提交):
(2)B删除了A的代码
第二天A一个更新,结果自己本地的代码也被删除了。
如何找回?
不能在文件上右击文件----TortoiseSVN ---Show log查看此文件的操作日志,就在这个目录下(是Test这个目录,这是前面下载代码时设置的本地仓库那个目录)右键----TortoiseSVN ---Show log,查看有多少人对这个项目提交了代码:
选择想要的代码,然后右键---保存(图里没有显示出来save,在下面):
只要代码被提交过,以后所有的操作都会被SVN记录下来,本地丢失了没关系,但是如果服务器端的那个仓库丢失了,就真的丢失了,所有管理员要对那个仓库备份。
多人操作同一个代码,提交由先后,导致版本问题
(提交代码必须保证自己修改的最新版本,所以每天早晨最开始就是先更新代码)
AB都update了保证自己是最新版本,然后修改了提交,但是有先有后,B 先提交了,那A提交时就会遇到版本问题,因为B提交后版本更新了一次,A那边就不是最新版本了:
提交失败,提示是过时版本,需要更新版本。点击OK:
选择 更新。
这时候出现一个问题,你代码没有提交,但是最新版本的代码却被拷贝了下来(B提交的那个版本),并且和你的代码合并了(Merged):
如果AB修改的不是同行的代码,那两人的代码合并就没有关系,你修改了第九行,我修改了第十行。合并后是正确的。依次点击OK提交上去就可以了。
如果AB修改的是同一行代码,SVN就合并不了,那就会出错。
更新之后,提交之前本地就多了几个文件:
黄色感叹号说明合并失败。此时不要再提交了。
打开黄色感叹号的文件:
上面是你想提交的代码,下面是现在已有的代码(两个代码修改的是同一行),此时就需要AB协商了。
.main文件里是你自己想提交的代码。
.r10 是老版本,是你修改之前的版本。其实是AB都没有修改时的那个版本
.r11 是你提交时服务器端的最新版本(数字越大,版本越新)。其实就是B提交的最新版本。
通过自己修改的版本,原来的版本,B修改的版本,双方可以协商出应该如何修改,是保留A的修改还是保留B的修改。
不要直接在黄色感叹号Test.java里修改,容易删除不干净。
如果保留A的修改, .main文件覆盖黄色感叹号文件Test.java(把.main文件修改文件名为Test.java即可覆盖)。
如果保留B的修改,直接右键操作文件恢复(直接修改文件名覆盖):
得到的就是最新版本了(B提交的版本)而且那三个文件也消失了:
如果都不要,用原来的版本, 就用 .r10文件直接修改文件名覆盖。
冲突的地方很多的情况:
AB都添加了代码,又都修改了同样位置的代码,然后提交有先后,B先提交,A提交出错,提示先更新。
这时候就不要去更新了。把自己的代码先复制到其他地方。
然后通过图中的操作把自己的代码恢复,得到上一个自己取得那个版本:
然后再更新,得到目前最新版本(也就是B提交的版本)。为什么不直接更新取B提交的最新版?因为更新的话还会多出来另外三个文件,比较麻烦?
然后把自己复制出去的修改一个名字拷贝进来。SVN有磁盘对比代码的工具。选中两个文件,右键,如图操作:
得到对比结果:
第一个方法都没有修改,第二个方法AB都修改了,需要双方协商。第三个是双方都新加的方法,都保留就可以了。
协商修改完,再次提交就可以了(自己复制进来的那个删除就可以了)。因为A这边提交了,此时B那边需要更新一下
B修改了A的方法,A没有发现,继续写代码
如图,A的方法里的操作被B修改了。
当双方都没有发现问题,经过很多版本提交后,比如测试时,发现那个方法报错了,但是已经很多版本过去了,不知道是谁因为什么修改的代码,怎么办?
SVN还有一个历史记录比对的工具
打开Show log:
得到历史版本记录:
此时选中最新的版本18和版本17,选择对比版本:
发现此方法已经被修改了,再依次选择版本17和16,再次对比,直到找到这个方法被修改的时候:
可以看到是版本16时,B修改的代码。然后就可以找B询问为什么修改了。