前言

查找了SVN的相关知识无论是园子里还是百度都只有一些理论,而有实践教程的都是点到为止,并没有一个完整的关于团队如何使用SVN协同工作的教程,因此写下该篇希望能对大家起到一点帮助。

面向人群

本教程面向有一定svn基础的,而且之前都是单人开发,对团队开发如何使用SVN并不了解,但急需了解的的同学。

背景

由于团队开发是如果没有正确的使用SVN经常出现A在做一个需求涉及到a,b项目,而B再做另一个项目涉及到a,c项目。
然后A做完了直接提交了代码,但是并未经过测试。B的代码测试完毕然后提交准备投产,然后发现A已经提交了代码,所以他就获取了A的代码,编译后如果不询问A是否代码经过测试,可能直接投产了,然后投产出现了问题。或者知道了A的代码还未测试,必须等测试通过后才能投产。否则只能恢复到测试完的代码进行投产。最后甚至有可能就忘记提交了。

解决方案

规定代码必须经过测试后才能提交,这一定程度上解决了这个问题,但是这就偏离了版本控制的初衷而且每次开发代码必须一次性开发完成,若开发中途发现问题,导致一部分代码需要重打,那么就不能很好的回滚。

团队开发生命周期

创建新项目

以下操作都是使用VS的VisualSVN插件,其他插件使用方法都是差不多的,在文件资源管理器中使用方法原理是一样的。

首先针对我们的SVNTest1项目

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

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

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

  4. 选择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种结构开发我们的项目,第一种是每个项目文件夹下创建这三个目录,然后进行开发;第二种方式在根目录下就创建三个文件夹,然后在这三个文件夹下有多个项目。这里我用第一种方式,两种方式只是结构不同,原理一样的

  5. 如果需要验证输入用户名和密码,然后点击导入,新项目就导入成功





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





  7. 我们可以将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`等。只要决定一个规范既可。

  1. 现在我们约定以/Test/branches/v0.1/person1的方式来存放,那么首先person1可以创建一个新的分支进行开发。

  2. 模拟person2同学并行开发,由于B同学需要获取全新的项目,因此需要首先从版本库中获取该项目





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

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

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

    • person1添加了一个文件1.cs





    • person2添加了一个文件2.cs





    我们发现他们可以正常提交而无需更新,因为实际他们是在不同的分支工作,当然不会产生影响

合并代码

假设person1已经开发完成并通过测试需要将分支合并到主线
  1. 切换到主线

  2. 点击合并







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

  3. 将本地主线提交到服务器

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

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





    提交成功后发现svn服务器主线已经有该文件

    4. person2已经开发完成并通过测试需要将分支合并到主线

    5. person2需要切换到主线

    6. 切换完点击合并







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

  4. 以上3个步骤忽略,不要直接切换主线,而是提交代码前先保证分支代码最新,首先将主线合并到分支





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

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

    提交代码后就有了

  6. 合并分支到主线







  7. 提交主线代码

    由于person1并未获取person2的代码因此person1实际只有1.cs,而person2由于在person1提交的代码后更新了主线代码,因此perosn2有1.cs和2.cs

正式版本发布

版本发布只针对trunk的目录进行发布

现在开发任务已经完成,我们认为这个版本已经很成熟,我们希望把这个版本定为v1.0,我们现在可以删除分支,同时将该版本打个标记

  1. 删除分支

    直接删除无用分支即可

  2. 做v1.0的标记

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

    切换到主线切出一个tags



bug修复

现在我们可能在开发2.*的版本了,突然发现1.0的版本有bug

  1. 从tags/v1.0版本中切除一个分支修复bug



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



  3. 修复bug后合并到trunk分支





结束语

至此整个团队开发生命周期就讲解完毕,接下来就是不断佚代的过程。

以上是我个人理解,如果看来此篇文章略有所学,请支持下,如若有误烦请指正。

PS: 第一次用vs code编写,还是挺好用的(●ˇ∀ˇ●)




微信扫一扫二维码关注订阅号杰哥技术分享

本文地址:https://www.cnblogs.com/Jack-Blog/p/5426956.html

作者博客:杰哥很忙

欢迎转载,请在明显位置给出出处及链接)

用SVN进行团队开发协作生命周期详解的更多相关文章

  1. ASP.NT运行原理和页面生命周期详解及其应用

    ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用.  ...

  2. ASP.NET生命周期详解

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  3. ASP.NET生命周期详解 [转]

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  4. ASP.NET生命周期详解(转)

    看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...

  5. React—组件生命周期详解

    React—组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...

  6. 010_React-组件的生命周期详解

    ReactJS 的核心思想是组件化,即按功能封装成一个一个的组件,各个组件维护自己的状态和 UI,当状态发生变化时,会自定重新渲染整个组件,多个组件一起协作共同构成了 ReactJS 应用. 为了能够 ...

  7. Maven生命周期详解

    来源:http://juvenshun.iteye.com/blog/213959 Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解 ...

  8. Android Activity 生命周期详解

    学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...

  9. Android学习笔记:Activity生命周期详解

    进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.co ...

随机推荐

  1. fastscript例子一

    fastscript例子一   fastscript例子一 unit Unit1; interface usesWinapi.Windows, Winapi.Messages, System.SysU ...

  2. 一个简单的用python 实现系统登录的http接口服务实例

    用python 开发一个登录的http接口: 用户登录数据存在缓存redis里,登录时根据session判断用户是否已登录,session有效,则直接返回用户已登录,否则进mysql查询用户名及密码, ...

  3. Windows核心编程:第5章 作业

    Github https://github.com/gongluck/Windows-Core-Program.git //第5章 作业.cpp: 定义应用程序的入口点. // #include &q ...

  4. C# Winform模仿百度日历

    想写博客不知道从何处开始,就从回忆开始吧. 第一个就从自定义日历控件开始 产生背景: 大概2015年时候有个项目要用到日历,用默认日历展示给用户看,用户毫不客气都说界面太丑,最好做成像百度日历那样方便 ...

  5. WPF ListBox的进阶使用(一)

    公司项目有个需求,UI界面支持动态平均分割界面,想了想便想到用ListBox来实现,用UniformGrid作为ListBox的ItemsPanelTemplate,通过动态改变UniformGrid ...

  6. 获取webpart方法以及连接字符串记录

    在页面地址后面添加?contents=1就可以显示所有页面的webpart部件了 server=wtcsps05;database=Testing_DB;uid=sqluser;password=wt ...

  7. 【转】 js数组 Array 交集 并集 差集 去重

    原文:http://blog.csdn.net/ma_jiang/article/details/52672762 最劲项目需要用到js数组去重和交集的一些运算,我的数组元素个数可能到达1000以上, ...

  8. 常用Java集合类总结

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 7.1.List(允许重复元素) ArrayList: 底层数据结构:Object[] 在查询(get).遍 ...

  9. 【文文殿下】WC2019游记

    Day0 今天早上三点半才睡着,五点起床,前往省城郑州.与省实验常老师汇合,坐上高铁,下午三点半多才到广州二中. 下午随便找了一个教室进去敲一敲代码,发现自己越来越菜了. 和一大堆网上的dalao面基 ...

  10. C语言实现简单CMDShell

    1.首先使用vc6编译器编译后门,并运行 #pragma comment(lib,"ws2_32.lib") #ifdef _MSC_VER #pragma comment( li ...