SVN最全使用总结

来源:互联网 发布:淘宝网严重违规b48分 编辑:程序博客网 时间:2024/06/01 09:11

TortoiseSVN客户端

TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。这就是为什么许多人将 Subversion 和版本控制系统看作一种“时间机器”。

一、客户端TortoiseSVN的安装

运行TortoiseSVN程序,点击Next,下面的截图顺序即为安装步骤:

1、


2、


3、


4、



二、客户端TortoiseSVN的使用方法

1、签入源代码到SVN服务器

假如我们使用IDE工具在文件夹StartKit中创建了一个项目,我们要把这个项目的源代码签入到SVNServer上的代码库中里,首先右键点击StartKit文件夹,这时候的右键菜单如下图所示:


点击Import,弹出下面的窗体,
其中http://zt.net.henu.edu.cn是服务器名,svn是代码仓库的根目录,
StartKit是我们在上个教程中添加的一个代码库。
说明:左下角的CheckBox,在第一次签入源代码时没有用,但是,在以后你提交代码的时候是非常有用的。


点击OK按钮,会弹出下面的窗体,要求输入凭据:


在上面的窗体中输入用户名和密码,点击OK按钮:


如上图所示,好了,源代码已经成功签入SVN服务器了。
这时候团队成员就可以迁出SVN服务器上的源代码到自己的机器了。

2、签出源代码到本机

在本机创建文件夹StartKit,右键点击Checkout,


弹出如下图的窗体:


在上图中URL of Repository:下的文本框中输入svn server中的代码库的地址,其他默认,
点击OK按钮,就开始签出源代码了。

说明:上图中的Checkout Depth,有4个选项,
          分别是迁出全部、
          只签出下一级子目录和文件、
          只签出文件、
          只签出空项目,默认的是第一项。
上面的例子中,我们也可以使用web的方式访问代码库,
在浏览器中输入http://zt.net.henu.edu.cn/svn/StartKit/
这时候也会弹出对话框,要求输入用户名和密码,通过验证后即可浏览代码库中的内容。
搞定!源代码已经成功签出到刚才新建的StartKit目录中。


打开StartKit目录,可以看到如下图的文件夹结构:


一旦你对文件或文件夹做了任何修改,那么文件或文件夹的显示图片机会发生变化。


不同状态所对应的图片:


我们已经知道怎么将源代码检出到SVN服务器,怎么从服务器签出代码到本机,也简单了解了不同状态所对应的图案啦。

详细说明几个常用图标


3、提交修改过的文件到SVN服务器

上面的图修改了位于Model文件中的二个文件ImageInfo.cs和NewsInfo.cs,下面演示如何提交到SVN服务器。
注意:提交源代码到服务器时,一定确保本机的代码是最新版本,否则可能提交失败,或者造成版本冲突。


在Model文件夹上点击右键或在Model文件下的空白处点击右键,点击SVN Commit…弹出下面的窗体:


点击OK按钮后,弹出如下图的窗体:


4、添加新文件到SVN服务器

我们在Model文件下添加一个新的类文件UserInfo.cs,
方式一,在Model文件下的空白处点击右键,点击SVN Commit…,和上面讲的提交修改过的文件到SVN服务器一样,就可以了。
方式二,另外也可以在文件UserInfo.cs上点击右键,点击TortoiseSVN=>>Add,先提到变更列表中,弹出如下图的窗体:


选中UserInfo.cs文件,点击OK按钮,这样并没有将这个文件提交到SVN服务器,只是将这个文件标记为源代码库库中的文件,并将其状态置为修改状态。
之后,我们要再SVN Commit这个文件一次,才可以将其真正提交到SVN服务器上的代码库中。
上面讲是添加文件,实际上,添加文件夹的步骤也是一样的,这里就不说了。

5、删除(Delete)


如果被删除的文件还未入版本库,则可以直接使用操作系统的删除操作删除该文件。
如果被删除的文件已入版本库,则删除的方法如下:
选择被删除文件,右键svn菜单执行”delete”操作,然后选择被删除文件的父目录,右键svn菜单执行”SVN Commit”.
使用操作系统的删除操作删除该文件,然后选择被删除文件的父目录,右键svn菜单执行”SVN Commit”,在变更列表中选择被删除的文件。如下图:


总结就是:选择要删除的文件,点击Delete,再把删除操作提交到服务器 。

6、重命名文件或文件夹,并将修改提交到SVN服务器


只要在需要重命名的文件或文件夹上点击右键,点击TortiseSVN=>>Rename…,在弹出的窗体中输入新名称,点击OK按钮,就可以了。此方法也不是直接重命名,而是将该文件或文件夹的名称标记为重命名后名称,也需要我们使用SVN Commit提交到SVN服务器后才真正重命名。

7、SVN还原(SVN Revert)

右击想要回退的文件或者文件夹,在TortoiseSVN弹出菜单中选择”Update to reversion…”然后会弹出一个窗口,如下:


比如说我们要回退到第10个版本只需要在Revision中填写相应的版本号,然后点击ok即可。

8、更新操作(将SVN服务器中所有版本变化更新到本地)

对于其他用户(指不是提交变化的用户),可执行SVN update命令完成将SVN服务器发生版本变化的文件更新到本地。


通常我们(记住每个人就是SVN的本地客户)在工作时,会不断执行SVN Update命令以获取SVN服务器中最新的文件,从而获得其他人的变更。
通常我们每天早上来的时候要更新一下代码,保证自己的代码版本是最新的,还有就是,在提交代码之前,要更新一下代码,减少版本冲突的几率。

9、显示日志(Show log)

通过此功能可以查到谁,什么时候,对那个目录下的那些文件进行了那些操作。


10、版本库浏览(Repo-browser)

此功能是用来浏览需要查看的资料库,在本地文件夹下点击右键,选择TortoiseSVNàRepo-browser,在弹出的对话框中输入资料库地址,再输入用户名和密码,就能查看到你需要查看到版本库的内容,在这你还能看到那些文件被谁锁定了。


11、如何解决冲突文件


产生冲突的原因

为什么会产生冲突代码呢?原因很简单就是因为不同的人,同时修改了同一个文件的同一个地方,这时候,他提交了,我没有提交,我就提交不了,这个时候我们要进行先更新,然后在进行提交即可,那如果产生冲突,会生成如下3个文件。

对于每个冲突的文件Subversion在你的目录下放置了三个文件:如下:


原文件的图标变为表示内容含有冲突
  1.txt.mine(格式:冲突文件名.扩展名.mine)记录了你的文件名内容
  1.txt.r4(格式:冲突文件名.扩展名.r版本号)记录了当前版本的上一个版本内容
  1.txt.r5(格式:冲突文件名.扩展名.r版本号)记录了当前版本的内容

接下来就是如何解决文件中的冲突,你可以选择以下方式解决冲突。


解决方法

解决方案如下:

首先我们可以看下1.txt代码如下:

<<<<<<< .mineaaaasdf11222333 dderderder=======
<pre name="code" class="java" style="font-size: 18px;">aaaasdf11222333 444444444
b>>>>>>> .r5

然后我去掉多余的代码,1.txt变成这样aaaasdf11222333 dderderder进行提交,还是提交不了,如下所示:

为什么?因为冲突会产生上面的三个文件,有上面3个文件存在肯定提交不了,这三个文件代码及解释如下:(1)1.txt.mine是冲突前自己的文件。可以看下内容如下:aaaasdf11222333 dderderder(2)1.txt.r4是冲突前本地的版本文件,内容如下:aaaasdf11222333(3)1.txt.r5是别人赶在你之前提交的版本

继续解决:内容说明

<<<<<.mine到 >>>>>.r5之间的就是冲突的部分,======之前的是你的内容,=====之后的是当前版本的内容可根据情况进行取舍,然后删除注释符号并删除新增的新增了三个文件,然后再提交就OK了!

方式一(这种方法可以用,但是不好用)

使用revert(回滚)操作,该操作表示用户放弃自己的更新代码,然后直接提交,这个时候你的代码就会使服务器上最新的代码,即A用户提交的新代码,你的代码不会被提交,如下所示:

点击ok按钮后可以看到其他三个文件都自动删掉了,1.txt代码变成如下代码:

aaaasdf11222333 444444444
也就是a用户提交的代码,我自己更新的代码需要自己动手复制进去即可提交commit。

方式二(推荐)

假如我现在3.txt产生冲突代码如下:

<<<<<<< .mine333333338888888888888=======3333cccccccccc3333>>>>>>> .r16

通过第一点我们知道,333333338888888888888这个内容是我修改后,未产生冲突之前的内容,3333cccccccccc3333这个代码是A用户提交的代码,从上面得知A用户新增内容是ccccccc,而我新增的内容是8888888。
那么第二种解决方法如下:
选择文件->右键Editconficts:这种方法需要冲突双方经过协商之后将代码更改统一之后再提交。不仅解决了冲突而且还保证了代码是正确的,因为只有一方的代码被提交.


如上图所示,红色的部分是冲突代码:theirs表示当前服务器端最新的代码,Mine表示自己修改后的代码,Merged表示合并后的代码。点击红色后右键选择:use this text block就可以将该部分代码作为合并后的代码。
接下来再说说由于冲突导致重要代码被覆盖的情况。冲突发生时如果采取的措施不对可能会导致部分代码丢失,如果想要还原之前的代码也很容易。
选择文件->右键选择show log在这里面你可以看见之前提交的所有版本,找到你想要恢复的版本右键选择revert to this version就可以恢复了.


继续深入解释方式二的操作步骤




单击保存会看到新增的三个文件已自动被删除(如果仍存在手动删除即可),这时再执行SVN Commit也OK了!


三、SVN客户端各菜单作用及常见符号

1、SVN客户端菜单作用

把SVN的所用功能及用法进行罗列

01、SVN Checkout(SVN取出)

点击SVN Checkout,弹出检出提示框,在URL of repository输入框中输入服务器仓库地址,在Checkout directory输入框中输入本地工作拷贝的路径,点击确定,即可检出服务器上的配置库。

02、SVN Update(SVN更新)
如果配置库在本地已有工作拷贝,则取得最新版本只是执行SVN Update即可,点击SVN Update,系统弹出更新提示框,点击确定,则把服务器是最新版本更新下来。

03、Import(导入)
选择要提交到服务器的目录,右键选择TortoiseSVN----Import,系统弹出导入提示框,在URL of repository输入框中输入服务器仓库地址,在Import Message输入框中输入导入日志信息,点击确定,则文件导入到服务器仓库中。

04、Add(加入)
如果有多个文件及文件夹要提交到服务器,我们可以先把这些要提交的文件加入到提交列表中,要执行提交操作,一次性把所有文件提交,如图,可以选择要提交的文件,然后点击执行提交(SVN Commit),即可把所有文件一次性提交到服务器上

05、Resolving Conflicts(解决冲突)
有时你从档案库更新文件会有冲突。冲突产生于两人都修改文件的某一部分。解决冲突只能靠人而不是机器。当产生冲突时,你应该打开冲突的文件,查找以<<<<<<<开始的行。冲突部分被标记:
<<<<<<< filename
your changes
=======
code merged from repository
>>>>>>> revision
Subversion为每个冲突文件产生三个附加文件:
filename.ext.mine
更新前的本地文件。
filename.ext.rOLDREV
你作改动的基础版本。
filename.ext.rNEWREV
更新时从档案库得到的最新版本。
使用快捷菜单的编辑冲突Edit Conflict命令来解决冲突。然后从快捷菜单中执行已解决Resolved命令,将改动送交到档案库。请注意,解决命令并不解决冲突,而仅仅是删除filename.ext.mineandfilename.ext.r*文件并允许你送交。

06、Check for Modifications(检查更新)
点击Check for Modifications,系统列表所以待更新的文件及文件夹的状态。

07、Revision Graph(版本分支图)
查看文件的分支,版本结构,可以点击Revision Graph,系统以图形化形式显示版本分支。

08、Rename(改名)
SVN支持文件改名,点击Rename,弹出文件名称输入框,输入新的文件名称,点击确定,再把修改提交,即可完成文件改名。

09、Delete(删除)
SVN支持文件删除,而且操作简单,方便,选择要删除的文件,点击Delete,再把删除操作提交到服务器。

10、Moving(移动)
选择待移动的文件和文件夹;按住右键拖动right-drag文件(夹)到跟踪拷贝内的新地方;松开左键;在弹出菜单中选择move files in Subversion to here

11、Revert(还原)
还原操作,如刚才对文件做了删除操作,现在把它还原回来,点击删除后,再点击提交,会出现如上的提示框,点击删除后,再点击Revert,即已撤销删除操作,如果这时候点击提交,则系统弹出提示框:没有文件被修改或增加,不能提交。

12、Branch/Tag(分支/标记)
当需要创建分支,点击Branch/Tag,在弹出的提示框中,输入分支文件名,输入日志信息,点击确定,分支创建成功,然后可查看文件的版本分支情况。

13、Switch(切换)
文件创建分支后,你可以选择在主干工作,还是在分支工作,这时候你可以通过Switch来切换。

14、Merge(合并)
主干和分支的版本进行合并,在源和目的各输入文件的路径,版本号,点击确定。系统即对文件进行合并,如果存在冲突,请参考冲突解决。

15、Export(导出)
把整个工作拷贝导出到本地目录下,导出的文件将不带svn文件标志,文件及文件夹没有绿色的”√”符号标志。

16、Relocate(重新定位)
当服务器上的文件库目录已经改变,我们可以把工作拷贝重新定位,在To URL输入框中输入新的地址。

17、Add to Ignore List(添加到忽略列表)
大多数项目会有一些文件(夹)不需要版本控制,如编译产生的*.obj, *.lst,等。每次送交,TortoiseSVN提示那些文件不需要控制,挺烦的。这时候可以把这些文件加入忽略列表。

18、SVN其它相关功能
客户端修改用户密码:
打开浏览器,在地址栏内输入http://192.168.1.250/cgi-bin/ChangePasswd,启动客户端修改用户密码的界面,输入正确的用户名,旧密码,新密码(注意密码的位数应该不小于6,尽量使用安全的密码),点击修改即可。

19、SVN Commit(版本提交)
把自己工作拷贝所做的修改提交到版本库中,这样别人在获取最新版本(Update)的时候就可以看到你的修改了。

20、Show log(显示日志)
显示当前文件(夹)的所有修改历史。SVN支持文件以及文件夹独立的版本追溯。

21、Repo-Browser(查看当前版本库)
查看当前版本库,这是TortoiseSVN查看版本库的入口,通过这个菜单项,我们就可以进入配置库的资源管理器,然后就可以对配置库的文件夹进行各种管理,相当于我们打开我的电脑进行文件管理一样。

22、Revision Graph(版本图形)
查看当前项目或文件的修订历史图示。如果项目比较大型的话,一般会建多个分支,并且多个里程碑(稳定版本发布),通过这里,我们就可以看到项目的全貌。

23、Resolved(解决冲突)
如果当前工作拷贝和版本库上的有冲突,不能自动合并到一起,那么当你提交修改的时候,tortoisesvn就会提示你存在冲突,这时候你就可以通过这个菜单项来解决冲突。冲突的解决有两种,一种是保留某一份拷贝,例如使用配置库覆盖当前工作拷贝,或者反过来。还有一种是手动解决冲突,对于文本文件,可以使用tortoiseSVN自带的工具,它会列出存在冲突的地方,然后你就可以和提交者讨论怎么解决这个冲突。同时它也对Word有很好的支持。

24、Update to Revision(更新至版本)
从版本库中获取某一个历史版本。这个功能主要是方便查看历史版本用,而不是回滚版本。注意:获取下来之后,对这个文件不建议进行任何操作。如果你做了修改,那么当你提交的时候SVN会提示你,当前版本已失效(即不是最新版本),无法提交,需要先update一下。这样你所做的修改也就白费了。

25、Revert(回滚)
如果你对工作拷贝做了一些修改,但是你又不想要了,那么你可以使用这个选项把所做的修改撤销。

26、Cleanup(清除状态)
如果当前工作拷贝有任何问题的话,可以使用这个选项进行修正。例如,有些文件原来是版本控制的,但是你没有通过tortoiseSVN就直接删除了,但是tortoiseSVN还是保留着原来的信息(每个文件夹下都有一个.svn的隐藏文件夹,存放着当前文件夹下所有文件夹的版本信息)所以这就会产生一些冲突。可以使用cleanup来清理一下。

27、GetLock/ReleaseLock(加锁/解锁)
如果你不想别人修改某个文件的话,那么你就可以把这个文件进行加锁,这样可以保证只有你对这个文件有修改权。除非你释放了锁,否则别人不可能提交任何修改到配置库中。

28、Branch/tag(分支/标签)
Branch是分支的意思。例如当在设计一个东西的时候,不同的人有不同的实现,但是没有经过实践检验,谁也不想直接覆盖掉其他人的设计,所以可以引出不同的分支。将来如果需要,可以将这些分支进行合并。
tag是打标签的意思。通常当项目开发到一定程度,已经可以稳定运行的时候,可以对其打上一个标签,作为稳定版。将来可以方便的找到某个特定的版本(当然我们也可以使用版本号来查找,但是数字毕竟不方便)
SVN对于分支和标签都是采用类似Linux下硬链接的方式(同一个文件可以存在两个地方,删除一个不会影响另一个,所做修改会影响另一个),来管理文件的,而不是简单的复制一份文件的拷贝,所以不会有浪费存储空间的问题存在。

29、Export(导出)
这个功能是方便我们部署用。当我们需要发布一个稳定版本时,就可以使用这个功能将整个工程导出到某个文件夹,新的文件夹将不会包含任何版本信息了。

30、Relocate(版本库转移)
当我们版本库发生转移的时候就需要用到这个功能了。例如我原先的版本库是建在U盘上的,现在转移到(复制整个配置库文件夹)开发服务器上,使用https代替文件系统的访问。因此就需要将原来的工作拷贝的目标版本库重新定位到开发服务器上。

31、create patch(创建补丁)
创建补丁。如果管理员不想让任何人都随便提交修改,而是都要经过审核才能做出修改,那么其他人就可以通过创建补丁的方式,把修改信息(补丁文件)发送给管理员,管理员审核通过之后就可以使用apply patch提交这次修改了。

32、diff(比较修改部分)
如果你修改了一个文件,又不确定改了那些地方,这时你可以在相应文件上点右键,选择diff查看,与服务器上最新版的差异

2、svn常见符号


黄色感叹号(有冲突):
--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人的修改。要解决冲突,如果你确认你的修改是无效的,则用TSVN还原你的修改就行了;如果认为你的修改是正确的,别人的提交是无效的,那么用TSVN先标记为“解决冲突”,然后就可以提交了;如果你认为你的修改和别人的修改都有一部分是有效的,那么你就把别人的修改手动合并到你的修改中,然后使用TSVN标注为“解决冲突”,然后就可以提交了。进入文件夹,寻找有黄色感叹号的文件,这些文件就是发生冲突的地方,根据实际情况处理冲突

米字号(有本地修改代码):
--这是说明你有未提交的本地代码。

问号(新加入的资源):
--这说明该文件是项目中新增文件资源,新增资源可以是文件、图片、代码等。

红色感叹号(本地代码与库没有保持一致):
--这说明本地代码跟库上没有保持一致,如果用户想修复,可以将带红色感叹号图标文件删除,直接update即可。

灰色向右箭头(本地修改过)
--本地代码没有及时上库。

蓝色向左箭头(SVN上修改过)
--记得更新代码后修改,提交前跟svn对比习惯。

灰色向右且中间有个加号的箭头(本地比SVN上多出的文件)
--修改完记得跟svn保持一致

蓝色向左且中间有个加号的箭头(SVN上比本地多出的文件)
--删除该文件后,再次更新,将svn上文件全部更新下来。

灰色向右且中间有个减号的箭头(本地删除了,而SVN上未删除的文件)
--也就是说你删除确认后,一定要记得上库,跟svn保持一致

蓝色向左且中间有个减号的箭头
(SVN上删除了,而本地未删除的文件)
--比对svn库上代码,确定需要删除后,更新svn(删除无用代码)。

红色双向箭头(SVN上修改过,本地也修改过的文件 )
--这个表示本地和svn上都修改过,最好就是把本地修改合并到svn,修改代码前最后先更新。


四、创建分支合并相互操作

项目中为何要创建分支,及合并?
比如我现在项目所有的文件放在主干上(trunk)中,由于需求的变更,需要增加新的需求,但是我们主干上还要继续往下开发,在此我们可以新建一个分支,来做增加新的需求那一块,主干上继续开发,等分支上代码没有问题的时候,再合并到主干上来。
创建分支的最大的目的就是跟主线进行并行开发时候不影响主线的开发。
如何操作?
假如我本地新建一个文件夹test下有2个文件夹trunk(存放主干上的代码)和branch(存放分支上的代码),如下所示:


1、先提取主干上的代码。

点击trunk-->鼠标右键-->点击SVN Checkout-->弹出一个对话框,如下图所示:


其中上面的URL是从服务器VisualSVN Server上获取的,如下所示:


直接右键qianduan3-->Copy URL to Clipboard(复制网址到剪贴板)即可。
其中qianduan3项目有如下文件,如下图所示:


最后点击上面的checkout按钮后,就可以在主干上把代码从远程服务器上获取到,如下所示:



2、新建分支

从trunk(主干上)创建分支(branch)步骤如下:
1.右键trunk-->branch/Tag如下图:


在弹出的对话框如下图:


点击ok按钮后,就可以在VisualSVN Serval服务器上新增newBranch,是从如上服务器qianduan3上的文件拷贝一份的,如下所示:


现在我们可以再来看看本地branch文件夹了,我现在直接进入branch文件下,右键 --> Chenckout下,就可以把newBranch下的所有文件提取出来了,如下所示:



点击ok按钮就可以把文件提取出来了,如下图所示:


分支目前建立在svn的服务器端,本地并没有更新,对本地branch文件夹,右键-->update即可,就可以更新到分支代码,如下所示:



3、合并分支到主干上

比如我现在对branch分支上新增3.txt文件,然后提交上去,如下所示:


我现在想把分支上的代码3.txt合并到主干上trunk,现在要怎么合并呢?步骤如下:
1.回到我们刚刚的主干(trunk)文件夹下,鼠标右键该文件夹-->TortoiseSVN-->Merge如下图所示:


在弹出的窗口,如下图所示:


接着点击【Next】下一步,如下图所示:


再接着【Next】下一步,如下图所示:



就可以看到主干trunk上多加了一个3.txt,就是从分支上合并过来的。


4、合并主干到分支。

如果主干上有一些更新,比如说jar包更新等等,那么这些要更新到分支上去,如何操作呢?比如我现在在主干上新建一个4.txt文件,比如如下:


我现在的分支上目录如下:


现在是想把主干上的4.txt合并到分支上来,要如何操作?
步骤如下,还是和刚刚操作类似.
1.我们在分支点击branch-->右键TortoiseSVN-->Merge如下图所示:


在弹出新窗口后,如下图所示:


接着点击【Next】下一步,如下图所示:


继续下一步,如下图:


最后直接merge,就可以看到分支branch上也有主干上的4.txt文件了,也就是说,合并主干到分支上也是可以的,如下图所示:








参考:

http://blog.chinaunix.net/uid-27004869-id-4112057.html点击打开链接

http://www.cnblogs.com/armyfai/p/3985660.html点击打开链接

http://www.cnblogs.com/sjj815/articles/5611266.html点击打开链接

http://lihong11.iteye.com/blog/1936520点击打开链接


0 0
原创粉丝点击