用SVN进行团队开发协作生命周期详解
前言
查找了SVN的相关知识无论是园子里还是百度都只有一些理论,而有实践教程的都是点到为止,并没有一个完整的关于团队如何使用SVN协同工作的教程,因此写下该篇希望能对大家起到一点帮助。
面向人群
本教程面向有一定svn基础的,而且之前都是单人开发,对团队开发如何使用SVN并不了解,但急需了解的的同学。
背景
由于团队开发是如果没有正确的使用SVN经常出现A在做一个需求涉及到a,b项目,而B再做另一个项目涉及到a,c项目。
然后A做完了直接提交了代码,但是并未经过测试。B的代码测试完毕然后提交准备投产,然后发现A已经提交了代码,所以他就获取了A的代码,编译后如果不询问A是否代码经过测试,可能直接投产了,然后投产出现了问题。或者知道了A的代码还未测试,必须等测试通过后才能投产。否则只能恢复到测试完的代码进行投产。最后甚至有可能就忘记提交了。
解决方案
规定代码必须经过测试后才能提交,这一定程度上解决了这个问题,但是这就偏离了版本控制的初衷而且每次开发代码必须一次性开发完成,若开发中途发现问题,导致一部分代码需要重打,那么就不能很好的回滚。
团队开发生命周期
创建新项目
以下操作都是使用VS的VisualSVN插件,其他插件使用方法都是差不多的,在文件资源管理器中使用方法原理是一样的。
首先针对我们的SVNTest1项目

在项目右击菜单中将整个项目加入到SVN中

首选选择需要加入的根目录点击下一步

新项目选择新建仓库,若已经在SVN服务器创建目录接口就选择添加存在项目

选择SVN的路径

在svn中我们创建的仓库下包含trunk,branches和tags三个文件夹,trunk为主线,branches为分支而tags则是标签
trunk:用于存放主线代码,我们不能在这里进行开发
branches:用于并行开发使用,每个需求或者bug修复都需要创建一个分支
tags:这里的代码不能编辑,只可读取,每隔标志性版本我们可以在tags中创建一个标签,如V1.0正式版,那么当代码合并到trunk后可以创建一个标签,如果接下来开发v2.0版本,而突然发现v1.0有个bug,就可以将次代码创建一个新分支用于修复bug,修复完成后可以合并到主线任务中并创建v1.1标签
我们可以使用2种结构开发我们的项目,第一种是每个项目文件夹下创建这三个目录,然后进行开发;第二种方式在根目录下就创建三个文件夹,然后在这三个文件夹下有多个项目。这里我用第一种方式,两种方式只是结构不同,原理一样的如果需要验证输入用户名和密码,然后点击导入,新项目就导入成功



导入成功只是在我们本地SVN缓存中导入成功,我们必须提交到服务器中



我们可以将bin和obj这些目录忽略掉,否则每次编译提交后他人更新都会有冲突,在VisualSVN插件提交默认已经忽略了这两个目录因此直接提交即可。




创建分支
现在主线已经创建好了 ,如果我们要进行开发或者修复bug,请不要在主线上面开发,我们必须先创建分支,然后再分支上进行开发,这样就不会影响到主线的代码,当分支开发完成并测试通过后可以合并到主线,同时若分支没用即可删除。

在工具栏中有常用的按钮,方便我们使用,如果使用其他SVN插件也是类似的,我们也可以直接在项目右击进行操作

不知为何在菜单中没有创建分支选项,我们直接在工具栏中创建,在文件夹右击创建分支也是一样的


如果否选切换工作副本至新分支,那么创建完会自动切换,如果没有钩,那么我们还是在原来的主线,我们暂时不勾选手动切换分支

创建完成由于我们没有勾选自动切换,svn就提示了我们手动切换,同时SVN服务器中也有了新的分支

切换分支

默认只有主线,这里我们选择切换到其他分支



现在我们已经切换到新的v0.1的分支了,现在假设person2同学需要对对该项目进行同步开发,因此我们希望每个人能区分开来,我们可以将项目根据人来区分,如
/Test/branches/person1/v0.1,/Test/branches/person1/v0.1-bug1,/Test/branches/person2/v0.1等,也可以根据项目来区分,如如/Test/branches/v0.1/person1/xxx,/Test/branches/v0.1/person1/fix-bug1,/Test/branches/v0.1/person2`等。只要决定一个规范既可。
现在我们约定以
/Test/branches/v0.1/person1的方式来存放,那么首先person1可以创建一个新的分支进行开发。
模拟person2同学并行开发,由于B同学需要获取全新的项目,因此需要首先从版本库中获取该项目



现在B同学需要创建一个新的分支到person2目录

此时目录结构如图所示,为了避免干扰项,我已从svn服务器删除了第一个创建的分支

现在person1和person2可以独立进行开发并提交代码到自己的分支上而不会影响主线,更不会影响其他人的开发了
person1添加了一个文件1.cs



person2添加了一个文件2.cs



我们发现他们可以正常提交而无需更新,因为实际他们是在不同的分支工作,当然不会产生影响
合并代码
假设person1已经开发完成并通过测试需要将分支合并到主线
切换到主线

点击合并




到此为止已经将分支合并到我们的主线,但是这里的主线只是我们本地的主线(svn会将分支保存到不同的目录,因此我们本地不同分支会存放在不同的临时目录的,在svn文件夹下,不要手动去修改该目录)

将本地主线提交到服务器

我们可以看到合并到主线后,我们的解决方案管理器有些黄色的圆点代表修改,我们看下svn服务器

发现我们虽然提交了代码实际服务器主线还并没有1.cs文件



提交成功后发现svn服务器主线已经有该文件
4. person2已经开发完成并通过测试需要将分支合并到主线
5. person2需要切换到主线

6. 切换完点击合并




会发先有冲突,因为person1已经提交了代码,而你本地的代码并不是最新代码,所以合并之前先将主线代码合并到分支,然后分支解决冲突后提交到服务器分支。再重新切换到主线进行分支合并,此时完整的流程即走完
以上3个步骤忽略,不要直接切换主线,而是提交代码前先保证分支代码最新,首先将主线合并到分支



解决冲突后,即可提交代码

代码还未提交时SVN服务器person2目录实际还没有1.cs文件

提交代码后就有了

合并分支到主线




提交主线代码

由于person1并未获取person2的代码因此person1实际只有1.cs,而person2由于在person1提交的代码后更新了主线代码,因此perosn2有1.cs和2.cs
正式版本发布
版本发布只针对trunk的目录进行发布
现在开发任务已经完成,我们认为这个版本已经很成熟,我们希望把这个版本定为v1.0,我们现在可以删除分支,同时将该版本打个标记
删除分支
直接删除无用分支即可

做v1.0的标记
标记其实就是一个分支,只不过tags文件夹应该设置为只读权限

切换到主线切出一个tags


bug修复
现在我们可能在开发2.*的版本了,突然发现1.0的版本有bug
从tags/v1.0版本中切除一个分支修复bug


修复bug后做一个v1.1的tags,或者根据情况合并当trunk


修复bug后合并到trunk分支



结束语
至此整个团队开发生命周期就讲解完毕,接下来就是不断佚代的过程。
以上是我个人理解,如果看来此篇文章略有所学,请支持下,如若有误烦请指正。
PS: 第一次用vs code编写,还是挺好用的(●ˇ∀ˇ●)

微信扫一扫二维码关注订阅号杰哥技术分享
本文地址:https://www.cnblogs.com/Jack-Blog/p/5426956.html
作者博客:杰哥很忙
欢迎转载,请在明显位置给出出处及链接)
用SVN进行团队开发协作生命周期详解的更多相关文章
- ASP.NT运行原理和页面生命周期详解及其应用
ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用. ...
- ASP.NET生命周期详解
最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...
- ASP.NET生命周期详解 [转]
最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...
- ASP.NET生命周期详解(转)
看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...
- React—组件生命周期详解
React—组件生命周期详解 转自 明明的博客 http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...
- 010_React-组件的生命周期详解
ReactJS 的核心思想是组件化,即按功能封装成一个一个的组件,各个组件维护自己的状态和 UI,当状态发生变化时,会自定重新渲染整个组件,多个组件一起协作共同构成了 ReactJS 应用. 为了能够 ...
- Maven生命周期详解
来源:http://juvenshun.iteye.com/blog/213959 Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解 ...
- Android Activity 生命周期详解
学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...
- Android学习笔记:Activity生命周期详解
进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.co ...
随机推荐
- hdu 4940 数据太水...
http://acm.hdu.edu.cn/showproblem.php?pid=4940 给出一个有向强连通图,每条边有两个值分别是破坏该边的代价和把该边建成无向边的代价(建立无向边的前提是删除该 ...
- nodeclub route
这里是把web_router.js放在根目录下,也可以放在routes文件件下,其实都可以. 这里就是一些url与controller和middleware对应
- iOS笔记之UIKit_UITextField
- (void)viewDidLoad { [super viewDidLoad]; //建立在你已经遵守了<协议UITextFieldDelegate> self.numTF.deleg ...
- 开机或联网时自启动gunicorn
网站部署完后,如果每次使用gunicorn启动网站会很麻烦,因此必须使gunicorn自启动. 环境 ubuntu 16. 参考: http://www.yangfan.cc/zhanzhang/14 ...
- jQuery基础(3)- ajax
一.jQuery的ajax 1.什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML). 简言之,在不重载整个网页的情况下, ...
- Smart/400开发上手4: 调试Cobol代码 (DEBUG with QBATCH)
Step1:Compile Cobol source CB TIM07 using *SRCDBG option例如:CB MEMBER(TIM07) OPTION(*SRCDBG) WORKU(TI ...
- 矩阵乘法在numpy/matlab/数学上的不同
数学意义上的矩阵乘法 注意事项: 1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘. 2.矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 3.乘积C的第m行第n列的 ...
- 几种int类型的范围
我们在编程的过程经常会遇到数据溢出的情况,于是这个时候我们必须定义能表示更大的数的数据类型来表示这个数. 下面列出了int型的范围: unsigned int 0-4294967295 ...
- nodejs&mongo&angularjs
http://www.ibm.com/developerworks/cn/web/wa-nodejs-polling-app/
- odoo开发笔记--模型字段compute用法
compute属性,实现的主要功能是,前端界面选择某个字段的时候,指定与该字段关联的其他字段可以关联,并联动的显示. 可以和inverse属性同时使用,不加inverse属性的话,前端界面的显示效果只 ...
