版本控制一(序言)

简介: 什么是版本控制? 版本控制(Revision Control)是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程.是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统.

什么是版本控制?

版本控制(Revision Control)是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程.是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统.

因为版本控制并不是从软件行业发展而来的,最初是运用在各种工程管理上,后来有了软件工程,也引入了版本控制.

版本控制能够解决什么问题?

只要参与过2个人以上的软件项目开发,不管是在工作中,还是在大学的项目中,就应该遇到过问题.比如大家先是划分好各自的工作,也许有一些约定,但是一些公共的方法或类可能就被成员写了很多次,而且每个都不一样,这样在代码上就会有冲突,容易引发BUG.而且想恢复到之前的版本只能copy、paste,不方便,而且还要经常这么做.发布项目时也困难重重:

image

所以总结之后,没有版本控制的项目有如下难处:

  • 代码管理混乱
  • 备份多个版本,占用磁盘空间大
  • 解决代码冲突困难
  • 容易引发BUG
  • 难于追溯问题代码的修改人和修改时间
  • 难于恢复至以前正确版本
  • 无法进行权限控制
  • 项目版本发布困难

SVN

SVN(Subversion)是一种开放源码的全新版本控制系统,是新一代的版本控制工具,由于其优于CVS的一些特点,得到了越来越多人的关注和使用,支持可在本地访问或通过网络访问的数据库和文件系统存储库.不但提供了常见的比较、修补、标记、提交、恢复和分支等功能,而且Subversion 还增加了追踪移动和删除的能力.此外,它支持非ASCII 文本和二进制数据,所有这一切都使Subversion不仅对传统的编程任务非常有用,同时也适于Web开发、图书创作和其他在传统方式下未采纳版本控制功能的领域.Subversion是近年来崛起的版本管理工具,在当前的开源项目里(JavaEE),几乎95%以上的项目都用到了SVN.Subversion项目的初衷是为了替换当年开源社区最为流行的版本控制软件CVS,在CVS的功能的基础上有很多的提升,同时也能较好的解决CVS系统的一些不足.

工作流程图:

image

从该图可以看出SVN分为三部分:客户端、服务器和数据仓库.客户端又分为命令行和图形用户界面两种,SVN安装完默认只有命令行.GUI只是对命令行功能的一种封装;服务器的访问方式有三种,主要是两种:mod_dav_svn和svnserve.mod_dav_svn是借助Apache的方式进行访问,svnserve是SVN内置的独立服务器;SVN支持两种数据仓库:数据库和文件系统.使用文件系统是推荐方式.以下是SVN对工程的管理方式:

image

这种方案被称为拷贝-修改-合并,是Subversion、CVS和一些版本控制系统共同使用的模型,在这种模型里,每一个客户联系项目版本库建立一个个人工作拷贝和到版本库中文件和目录的本地映射.用户并行工作,修改各自的工作拷贝,最终各个私有的拷贝合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误.拷贝-修改-合并模型感觉有一点混乱,但在实践中,通常运行的很平稳,用户可以并行的工作,不必等待别人,当工作在同一个文件上时,也很少会有交迭发生,冲突并不频繁,处理冲突的时间远比等待解锁花费的时间少.最后,一切都要归结到一条重要的因素:用户交流.当用户交流贫乏,语法和语义的冲突就会增加,没有系统可以强制用户完美的交流,没有系统可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突,实践中,锁定除了约束了生产力,并没有做什么事.拷贝-修改-合并有一个很致命的缺点,就是对那些无法合并的二进制文件管理起来困难,因此,Subversion也提供了锁定-修改-解锁的方案,用来更好的管理二进制文件.因此,我们采取混合版本控制方案,即,对源代码的纯文本文档实行拷贝-修改-合并的方案,对二进制文件,如dll、图书等采用锁定-修改-解锁的方案.也就是通过autoprops.reg中的信息,来告诉Subversion怎么去管理这些文件.

以下是采用锁定-修改-解锁方案的vss工作流程:

image

可以看出这种模型的效率并不高,在一个时间段里版本库的一个文件只允许被一个人修改.但是它也有优点:能非常好的保证版本库中所有文件的一致性,能避免大部分的冲突.但锁定-修改-解锁模型有一点问题就是限制太多,经常会成为用户的障碍,比如:

  • 锁定可能导致管理问题
  • 锁定可能导致不必要的线性化开发
  • 锁定可能导致错误的安全状态

如果万一被某个人锁住,然后离开,半天不回来,那项目组的其他人就可以放假了.当然这种情况基本上不会发生.

SVN需要与人交互,来获取服务器的最新文件,或者更新服务器版本库的文件,流程图如下:

image

上图也基本列出了必然使用的方法,SVN工作的基本思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序.由仓库管理员统一管理这些源程序,这样,就好像一个人在修改文件一样.避免了冲突,每个用户在使用仓库之前,首先要把仓库的项目文件下载到本地.用户做的任何修改首先都是在本地进行,然后用SVN命令进行提交,由SVN仓库管理员统一修改,这样就可以做到跟踪文件变化、冲突控制等等.

 

 


 

如果本文有任何问题,请及时指出,以免对后来者产生不必要的困扰,不胜感激!

目录
相关文章
|
8月前
|
开发工具 git 开发者
Git常用命令大全:让你轻松驾驭版本控制
Git命令速查:`git init`新建仓库,`git clone`克隆,`git add`入暂存区,`git commit -m`提交,`git status`查看状态,`git log`查看历史,`git branch`创建分支,`git checkout`切换,`git merge`合并,`git pull`拉取更新,`git push`推送,`git remote -v`查看远程,`git checkout --`撤销本地修改,`git reset HEAD`取消暂存,`git reset --hard`回退版本。掌握这些,提升代码管理效率!
|
4月前
|
存储 Linux 开发工具
掌握版本控制的艺术:Git 技巧深度解析
在软件开发中,版本控制对于代码管理和团队协作至关重要。Git 作为最流行的分布式版本控制系统,凭借其强大的功能和灵活性成为开发者必备工具。本文深入探讨 Git 的高级技巧和最佳实践,包括交互式暂存、撤销提交、合并冲突处理等,帮助你更高效地使用 Git。通过遵循清晰的提交信息、保持提交原子性、利用分支开发等最佳实践,开发者可以更好地管理代码库,提升协作效率。
|
5月前
|
NoSQL 测试技术 持续交付
版本控制进阶
版本控制进阶
42 1
|
5月前
|
存储 Shell 开发工具
Git 入门:从零开始掌握版本控制的艺术
【8月更文第16天】 在软件开发中,版本控制是一项至关重要的技能。它帮助开发者追踪文件的变化历史,并且可以在多个开发者之间协同工作。Git 是目前最流行的分布式版本控制系统之一。本文将带你从零开始学习 Git 的基本使用方法。
69 0
|
6月前
|
Linux 项目管理 开发工具
如何利用Git进行高效的版本控制
【7月更文挑战第3天】Git是一个强大的版本控制系统,通过掌握其基本操作、遵循最佳实践并学习一些高级技巧,你可以更加高效地进行版本控制,提升开发效率和代码质量。希望本文能为你的Git之旅提供一些有益的帮助。
|
8月前
|
开发工具 git 开发者
Git入门:轻松掌握版本控制的艺术
【5月更文挑战第13天】Git是流行的版本控制系统,适合各种规模的项目。本文引导读者入门Git,学习版本控制艺术。内容涵盖Git简介、安装配置、基础操作(如初始化、添加文件、提交、查看状态和历史)、分支管理、协作开发(克隆、推送、拉取)及高级用法,如标签管理、子模块和版本比较。遵循最佳实践,如频繁提交、有意义的提交信息和合理分支管理,可提升开发效率。
|
8月前
|
前端开发 持续交付 开发工具
【专栏:工具与技巧篇】版本控制与Git在前端开发中的应用
【4月更文挑战第30天】Git是前端开发中的必备工具,它通过分布式版本控制管理代码历史,支持分支、合并、回滚等操作,促进团队协作和冲突解决。在前端项目中,Git用于代码追踪、代码审查、持续集成与部署,提升效率和质量。优化协作包括制定分支策略、编写清晰提交信息、定期合并清理分支及使用Git钩子和自动化工具。掌握Git能有效提升开发效率和代码质量。
113 2
|
前端开发 Cloud Native Go
《Git进阶:掌握版本控制的高级技巧》
《Git进阶:掌握版本控制的高级技巧》
79 0
|
Ubuntu 网络安全 开发工具
Git入门:从零开始的版本控制之旅
本文介绍了基于Git的版本控制基础知识,包括初始化仓库、提交变更、分支管理和协作开发等关键概念。通过学习这些操作,你将能够高效地跟踪代码变化,保护代码质量,并与团队成员协作开发。这是一次深入浅出的Git入门之旅,让你轻松掌握版本控制的精髓。
145 0
Git入门:从零开始的版本控制之旅
|
算法 Java Linux
注意!不看太后悔了!未来工作中如何多人协作?让我用git给你演示!
目前,我们的仓库中只有一个 master 主分支,但在实际的项目开发中,在任何情况下其实都是不允许直接在 master 分支上修改代码的,这是为了保证主分支的稳定。这时推送失败,因为你的小伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用 git pull 把最新的提交从origin/dev 抓下来,然后,在本地进行合并,并解决冲。要说明的是,我们切换到的是本地的 dev 分支,根据示例中的操作,会将本地分支和远程分支的进行关系链接。冲突,就使用我们之前讲的冲突处理解决掉冲突。
164 0