持续更新中
前言:工作也有一年多了,涉及到写代码的小项目也做了若干个,看着Code文件夹里的一个个项目文件夹,觉得真是得赶紧采用版本控制工具了,不然以后项目越做越多、越做越大,到时候再用版本控制工具的话,会多花费很多功夫。考虑到所在公司的实际情况,决定采用TortoiseSVN。其实迅速找到一个比较靠谱的工具就行,更重要的还在于人,工具只是一个辅助,不能舍本逐末。
TortoiseSVN的学习和使用是根据官方教程的流程一步步进行的。
基本概念
Repository(代码库)
代码库,在本机上的话,就是用于存放所有自己的代码的地方。在服务器上的话,就是用于保存团队所有代码。如果只想备份一个地方的代码,那就备份这里的吧。
Working Copy(工作拷贝/工作副本)
这是实际写代码的地方,比如开发者将代码从服务器上拖到本机,然后在本机写代码,编写完成后再提交到服务器上。在这个过程中,存在于本机上的代码即为“Working Copy”。
因为TortoiseSVN只是将自己集成到了系统右键菜单中,所以如果没有再安装增强TortoiseSVN功能的软件的话,直接在Windows资源管理器中通过右键菜单进行代码管理即可。
小试牛刀
这里我们先迅速了解一下TortoiseSVN的基本功能。
建立代码库
在实际开发环境中,代码库应当放在一个合适的位置,并用Subversion服务来进行管理。不过TortoiseSVN也支持直接访问本机的代码库所在目录。
在这里,我们先在D盘Code目录下新建一个Repository
文件夹,在该文件夹上点击右键,选择TortoiseSVN
菜单中的Create Repository here...
这一项,在弹出的窗口中点击Create folder structure
按钮,这样就在这个目录下建立起空的代码库了。
注意:如果有团队合作编写代码的需要,建议尽量使用Subversion server的方式进行管理,不要只是简单地通过局域网来共享代码,相信这条建议后面一定有许多惨痛的教训。
导入项目
代码库虽然建立起来了,但里面还是空的,我们先导入一个现有的项目试试看。
右键点击现有项目HelloWorld的文件夹,选择TortoiseSVN
菜单中的Import
这一项,在弹出窗口中的URL of repository
这一项中,指定该项目要导入到什么目录中,这里我们填写file:///d:/Code/Repository/trunk/HelloWorld
。
此外,在弹出窗口的Import message
这一项中,可以填写所导入项目的信息。个人感觉可以写得详细一些,因为是导入现有的项目,那肯定已经多多少少有一些功能了,在导入的时候把项目现有的功能详细地列一下,后面再增加或者修改功能的时候也方便进行对照。不管做什么工作,提前为将来的需求考虑一下,是个很好的习惯。
导入了一个5G多的项目,但是查看
Repository
目录,却只有1G的大小,是不是说导入项目并不是将项目整个目录从原来的位置复制一份到Repository,而只是建立对原项目的索引?
检出一份工作拷贝
项目已经导入到Repository里面了,下面就需要再建立一份工作拷贝用于进一步的开发,要注意前面的导入项目这步操作并不会将导入后的项目文件夹自动转换为工作拷贝。在Subversion中,创建一份全新的工作拷贝的术语叫做Checkout
。
这里我们先新建D:/Code/Project/HelloWorld
这么一个文件夹,在该文件夹上点击右键,选择TortoiseSVN
菜单中的Checkout…
,然后输入file:///d:/Code/Repository/trunk/HelloWorld
即可。
这次检出的时候又查看了一下,倒是把项目整个文件夹原样地复制到
D:/Code/Project/HelloWorld
目录下了。注意:在默认情况下,
Checkout…
功能是直接显示在右键菜单中的,并且有SVN
这个词作为前缀。是因为TortoiseSVN中的功能,如果直接显示在右键菜单而不是作为TortoiseSVN
的子菜单显示的话,都会有SVN
这个前缀。
修改代码
在检出一份工作拷贝之后,就可以开始修改代码了。对比修改前后的不同之处,只需要在资源管理器中被修改的文件上点击右键,选择TortoiseSVN
菜单中的Diff
即可。如果修改后的代码没有问题,就可以提交了,右键点击工作拷贝文件夹,选择TortoiseSVN
菜单中的Commit
,提交对话框列出了所有已被修改的文件,每个文件前都有一个复选框,这样可以只提交部分文件的更改。在对话框中再补充本次修改的说明之后,就可以提交了。
添加文件
TortoiseSVN不仅可以对文件的修改做记录,当然也可以对文件的新增做记录。右键点击工作拷贝目录中的某一文件夹,选择TortoiseSVN
菜单中的Add
,便会显示在本机上新增但未添加到TortoiseSVN中的文件。如果直接在某个或者某几个在本机上新增的文件上点击右键,选择TortoiseSVN
菜单中的Add
,便可直接将这些文件添加到TortoiseSVN的记录中。
查看项目历史
TortoiseSVN的最常用的功能之一就是Log Dialog(日志对话框),在这个窗口中会显示每一次代码提交的信息。
撤销更改
既然是版本控制工具,那么既能提交新版的代码,也应当能够恢复到旧版的代码。是的,如果在最近一次提交之后对代码做了更改,但又想恢复至提交时的版本,那么右键点击工作拷贝目录中的某一文件,选择TortoiseSVN
菜单中的Revert
即可,如果只想撤销文件中的部分更改,那就用TortoiseMerge吧,可以对比每一处更改,并只对部分更改进行撤销。
如果想将项目整体回退至某个已提交的版本之前的状态,打开Log Dialog,点击对应的版本,右键菜单中选择“Revert changes from this revision”,这样代码就会回退至该版本之前的状态了。
版本控制相关的基本概念
The Repository
Repository不仅以树状目录结构保存文件,并且还会保存文件及文件夹的所有更改:增加/删除/移动。想知道上周三某个目录里面有什么?好说。
这就是版本控制工具的核心功能:记录并追踪对数据所做的所有更改。
版本管理模型
文件共享带来的问题
假设服务器上有一份代码 helloworld.c,需要小明和小黄来共同编辑维护,小明先写完了自己的功能,把文件放到服务器上了,小黄后来也写完了,也把文件放到服务器上了,问题来了,小明的文件被小黄直接覆盖了!这该怎么办?这就需要版本控制来帮忙了。
锁定-修改-解锁方案(Lock-Modify-Unlock)
这个方案比较简单,就像是在图书馆借书:小明把一本书借走了,小黄这时候就没法借这本书了,这时候这本书就被“锁定”了,只有等小明读完了这本书,还到图书馆之后,这本书才被“解锁”,这时候小黄才能再借这本书。这套方案有什么缺点呢?
你拿走了,我就不能用了。比如小明把书借走了,但是一直没想起来还回来,那小黄就只能干等着,小明什么时候换回来,小黄什么时候才能借。
你只看前十页,我只看后十页,一起看呗?——不行。比如小明只需要编辑某个代码源文件的前面一部分,小黄只需要编辑后面一部分,这个时候,小黄依然只能干等着,你说浪不浪费时间?
锁越多越安全?那可未必。比如小明在修改文件A,小黄在修改文件B,而A、B之间有依赖关系,结果他俩一修改,最后两个文件都不能用了!你说这可咋整。
复制-修改-合并方案(Copy-Modify-Merge)
Subversion,CVS以及其它的一些版本控制系统采用的则是这套方案。小明和小黄从服务器上复制同一份文件,在各自的电脑上进行编辑,然后提交至服务器时,在版本控制系统和人工判断的共同处理之下,对文件进行合并,最后两个人的修改都能生效,并且还不会产生问题。在这个时候,起关键作用的是人之间的交流,怎样处理两份文件相冲突的地方,以保证已有功能的正常使用,还能确保新功能的成功上线,都是需要人的判断的。