版本控制

A、 从VSS到SVN再到Git 记Git的基本操作。

      原文地址:https://blog.csdn.net/u012104256/article/details/53497097

      

Source code control 一直是软件开发过程中重要的环节,从最初的纯文件备份,到使用工具进行管理。Source code control 工具的作用也不仅仅只是单纯的对同一个版本进行管理了。从目前主流的source code control工具当中不难发现里面的Branch, tag等功能的应用场景越来越多,特别是现在多数企业使用的敏捷编程,结合branch和tag等功能真的能够很好的做到多版本开发,快速迭代。

思考: 没有source code control我们如何快速的基于一份代码同时进行多个功能的并行开发。

回过头来说下本人在行业当中所用到的几款source code control工具。

VSS

VSS(Visual Source Salf),是一款微软提供的代码管理工具,作为Visual Studio的一员,在早期的开发过程当中确实能够确保代码不被开发人员错误的修改,也解决了异地开发协作的代码共享管理的难点。但是依旧有一些不足,比如:

  • 文件基本以独占的形势进行锁定。如果A在修改的时候B没有办法进行修改。
  • VSS只支持Windows版本,支持的开发工具仅支持微软系。
  • 基于文件存储,服务器必须共享文件夹。安全性值得考虑。以前一般用于内网开发环境。
  • 收费

SVN

SVN(Subversion),一个开源的source code control system。除开最基本的如VSS提供的代码管理功能外,最大的亮点是提供了分支,且提交内容的级别基于代码行了。也就是说,不用再有独占文件开发的问题了。比如,一个实现接口的代码文件可以由多个开发人员同时修改。谁先做完谁可以先进行提交,不会等到必须所有的人做完后再进行合并。对于不能使用VSS的工程师来说,SVN的出现完全是一个福音,直接从CVS跳到了这么强大的工具上。
总结一下,SVN的优劣如下:

  • 优势:
    • 代码一致性高。
    • 支持提交事物性操作。
    • Diff 功能。
    • Branch,Tag的引用,方便版本管理。
    • 轻松上手。
  • 劣势
    • 必须是联网状态下才可以进行一些数据的读取。
    • 不是分布式的代码库。
    • SVN服务器崩溃的灾难是巨大的。

Git

随着开源运动的流行(Liunx开发人员的功劳),Git也就这么流行起来的。说是在随着开源运动的流行而流行起Git的呢?这归功于Git的分布式这一特性。试想,如果全世界所有的Liunx爱好者都在几台机器上进行开发和提交,这酸爽不敢想象。抑或是主服务器崩溃了,那么其他的开发人员也只有泪奔。
Git的牛逼之处在于以下:

  • 每一次Clone就是从服务器上pull到了所有的内容,包括版本信息。
  • 在本地可以根据不同的需要,本地新建自己的分支。
  • 分支之间的任意切换。
  • 单机上就可以进行分支合并。
  • 牛人+插件加持。 Git flow, 按Vincent Driessen 分支模型提供的一个插件.

A successful Git branching model

如何使用Git

  1. 安装
  2. $ Brew install git

  3. 创建仓库

  4. $ git init
  5. 文件操作

    有了仓库后就可以对文件进行 add , commit, push 和pull等操作了。

Tables Are
git add 添加至暂存区
git add–interactive 交互式添加
git apply 应用补丁
git am 应用邮件格式补丁
git annotate同义词,等同于 git blame
git archive 文件归档打包
git bisect 二分查找
git blame 文件逐行追溯
git branch 分支管理
git cat-file 版本库对象研究工具
git checkout 检出到工作区、切换或创建分支
git cherry-pick 提交拣选
git citool 图形化提交,相当于 git gui 命令
git clean 清除工作区未跟踪文件
git clone 克隆版本库
git commit 提交
git config 查询和修改配置
git describe 通过里程碑直观地显示提交ID
git diff 差异比较
git difftool 调用图形化差异比较工具
git fetch 获取远程版本库的提交
git format-patch 创建邮件格式的补丁文件。参见 git am 命令
git grep 文件内容搜索定位工具
git gui 基于Tcl/Tk的图形化工具,侧重提交等操作
git help 帮助
git init 版本库初始化
git init-db* 同义词,等同于 git init
git log 显示提交日志
git merge 分支合并
git mergetool 图形化冲突解决
git mv 重命名
git pull 拉回远程版本库的提交
git push 推送至远程版本库
git rebase 分支变基
git rebase–interactive 交互式分支变基
git reflog 分支等引用变更记录管理
git remote 远程版本库管理
git repo-config* 同义词,等同于 git config
git reset 重置改变分支“游标”指向
git rev-parse 将各种引用表示法转换为哈希值等
git revert 反转提交
git rm 删除文件
git show 显示各种类型的对象
git stage* 同义词,等同于 git add
git stash 保存和恢复进度
git status 显示工作区文件状态
git tag 里程碑管理

.
.

Best practice

建议使用github进行上手实验。使用邮箱注册一次Git hub后即可在Github上创建自己的Repository.


2.png

创建完成后,我们会得到一个Repository的地址。有了这个地址我们就可以进行Git的练习了。


3.png
  • 使用 git clone 将远程仓库clone到本地。

     git clone

5.png
  • 添加一些文件
  echo "Hello Scott" -> "Hello"   //写了一个文件到Hello
  git add Hello // 将Hello文件添加到暂存区。(Index) git commit -m "this is my first file" // 提交到本地仓库 git push //推送本地仓库到远程仓库

6.png

以上,文件就被推送到了远程仓库。其他工程师如果执行Pull操作的话即可把变动的文件拉到本地。


7.png
  • 如果有其他工程师修改了文件,需要远程获取下。
     git pull  //拉取远端文件
     git log //可以查看变更历史

A5B85BFD-764E-468F-81C4-0B727BA70428.png
  • 冲突的解决
    冲突往往是因为版本不一致而产生。如工程师A修改了Hello文件并提交到远端仓库,而B在本地修改了Hello,也想提交。由于A和B的Hello文件并不一致,所以冲突产生了。

4EB9EB75-2FF9-4363-AD78-9E13D1415EA8.png

只需要git pull一次即可。 (注:git pull 会自动merge,但是通常情况下自动merge效果不会太好。比如A和B 都在修改function A (){} )
冲突长这模样。


10.png

一般手动解决冲突后,重新添加,提交,push即可。


11.png

如上描述,手动合并冲突比较麻烦。建议使用工具进行git 的操作,现在一般的工具都提供了分支管理,合并等功能。
推荐 SourceTree

分支的管理

在很多时候会遇到同时需要开发多个功能,开发任务将会交给多个工程师进行开发,这个时候在Git上的实践为-->创建多个分支。 N个工程师从Master或Dev分支进行分支创建。

git checkout -b NewFeature   // 分支建好后,会直接切换到该分支。
git push --set-upstream origin NewFeature //与远程分支关联

完成开发后,需要合并到Master 或Dev 分支。

  git merge origin/NewFeature  // 将远程分支NewFeature与当前分支合并。

12.png
 
 
B、 svn对比VSS。原文地址:http://www.cnblogs.com/zxjyuan/archive/2011/12/07/2280042.html

       

项目

VSS

SVN

备注

原子性提交

Atomic commit

不支持

支持

SVN无论批量提交包含多少文件修改,只有当全部文件修改都成功入库,该提交才变得有效,才对其他用户可见;否则,无论任何原因造成中断,SVN都会自动“回滚”(rollback)操作。换一个说法,SVN保证所有的修改要么全部入库生效,要么个也不入库,即对版本库不作任何修改。

重命名

不支持

支持

这对Java和C#开发很重要,为了得到更好的代码,开发中需要经常进行重构,重构就经常涉及到文件的重构名,有时会对文件重命名再提交。

最小提交块

文件

smallest commit block is a file

a line is the smallest commit block

最小提交块是文件,这样通过看历史很难找出某次checkin到底checkin了什么东西

安全性

基于文件系统共享实现对服务器的访问,需要共享存储目录

SVN服务器有自己专用的数据库,文件存储不采用“共享目录”方式,所以不受限于局域网。客户端可以是不同的平台,都是通过tcp/ip和特定端口来访问SVN服务器,有不同安全等级的访问协议可供选择

是不是每次使用VSS的时候得登记一次服务器?麻烦了吧

离线开发操作

需要执行几个步骤也可以安全入库,但麻烦

不需要另外操作

模式

主要采用独占模式(checkout,modify,checkin)也可以使用(multi_checkout,modify,checkin,merge)模式。

使用update,modify,commit方式。每个人可以修改自己可以访问的任意代码,代码不会被一个人单独占用。可以多人修改同一份代码,并且每个人的修改结果都不会丢失。如果提交时SVN没有发现冲突,则代码可以直接入库。否则SVN会让你手工合并

Internet网络和远程协作

VSS8.0支持

更适合基于互联网协作开发,速度快

支持平台

Windows

Windows,Linux,Unix

works on windows, linux, unix, and even macs and also java which makes it ultimaly portable

支持开发工具

VS6,

VS.NET2005,

VS.NET2008(不过有个bug)

VSS Plugin for Eclipse

SVN for VS.net 2005 Plugin-AnkhSVN,

也支持vs.net2008,

SVN for Eclipse

客户端

VSS client

Windows下:TortoiseSVN,Linux下:RapidSVN

自动合并

据说VS2005中也支持了?

提供,如果不能自动合并,可以手工修改冲突

多版本分支的合并

版本分支

但在操作中VSS首先要做项目共享,引入要分支的项目或文件然后做分支操作

自动建立分支

异地开发

支持

支持

操作的便利性

安装、配置、使用均简单,很容易上手使用

安装、配置较复杂,但使用简单,只需对配置管理做简单培训即可

版本管理

手工

通过label来自定义一个版本号,可以解决部分项目管理的问题,但这是远远不够的,当一个产品根据用户需求产生一系列不同的项目版本时使用VSS将难以管理

提交时记录版本号,自动分支管理

VSS版本发行时只能手工挑选对应的版本文件进行发布。

与外围工具集成

各种各样的外围工具(主要是服务器端),满足多种需要。如果有需要也可以自己写插件或管理脚本,开放的架构,允许我们这样做。

费用

商业

proprietry

开源免费

open source (Apache/BSD-style license.)

微软自己不用VSS,它用啥?SouceDepot!

不同意很多人说的“工具够用就行”,就算是两件工具可以完成完全一样的功能,其设计哲学和使用方式上肯定也会有区别。如果是每天必用的工具,不够便利的,或者蹩脚的使用方式会持续的影响你工作时的心情,而谁又愿意每天工作时都被工具逼得心情不好?

http://www.javaeye.com/post/583660?page=1

使用VSS,如果我周末回家办公,怎办?把代码全部checkout,再通过vpn连加VSS。

反对:如果我是甲方,要审查你的代码,svn可以直接通过http浏览代码,非常轻松,而VSS,还得装VSS客户端(license谁给?),还要用VPN连到乙方的局域网里(人家也得要有VPN啊,许多小公司网络是租用的没有vpn)

Subversion比VSS强的一个地方是如果文件改名了,以前的历史记录不会被丢失。呵呵,打个比方,Subversion就像一个聪明的警察,尽管罪犯虽然改名或整容了,但是他的前科还是被这个聪明警察给顺藤摸瓜给记录下来了。而VSS就像一个有点健忘的警察,罪犯名字一改,VSS就完全忘记了他的前科。

VSS 和 SVN/CVS 在锁定和非锁定上的处理源自应用环境的不同.

VSS 产生于微软这样的 close source 的企业, 而在这样的企业里, 开发软件时, 团队成员间通常就在一个办公室里, 文件的锁定/解锁的协调相对容易, 任务也许可以真的分配到一个人就在一个文件上工作; 但, 在开源世界里, 开发人员来自世界各地, 在世界的每个角落/不同时间里参与着项目的开发, 如果你今天在北京把一个文件锁住, 晚上没做完, 没提交, 然后睡觉去, 我们美国的同志们若也参与这个功能的开发, 那么在北京时间凌晨 2:00 的时候, 你尚在美梦中, 而那边已是早上 9:00 的工作点, 这样就没法对这个文件进行修改, 只能等到你呼呼睡醒, 北京时间 9:00 上班, 而美国那边已经是 16:00, 浪费大半天, 该下班了...

那么我们在公司里, 是不是其实应该很适合用 VSS 呢? 举个简单的例子就知道不行了 - g20 项目中我们有个 g20.js 的文件, 所有 ajax 相关的功能都在这个将近 6K 行代码的文件里完成, 我们的同学们经常需要同时并行着做两个以上的功能, 这使得我们不可能采用锁定的模式. 而 SVN 的拷贝-修改-合并模式并没有在现实中带来想像中的那么多"冲突" - 只要功能拆解得当, 不会出现两个人同时修改同一个文件同一行的情况, 最常见的情况就是你在 200 行后加了个 function, 我在 300 行后编辑了一些条件判断.

C、project从VSS迁移到SVN,保留日志。原文地址:https://blog.csdn.net/gege_zhailot/article/details/52488247

     

得空研究了一下如何将项目从VSS迁移到SVN,上网查了很多资料,发现没有几篇相关的文章,而且照着别人的方法试也没有成功,最后我自己摸索了一番,成功将project迁移,现在分享一下,希望能帮助需要帮助的人.

我在自己电脑上模拟迁移过程,

工具:vss 2005,    virtualSVN,    TortoiseSVN

IDE:   visual stdio 2010

1.安装vss,创建database:    repo1;

2.将vss与visual stdio绑定,步骤自行百度,(安装vss,和vs的project存到vss的仓库里的步骤我是按照网上的视频做的,网址找不到了,谁实在找不到的话给我留言)

3.在vs中创建项目,会自动让你选择vss登录用户,要存入的database

4.下载vss2svn工具,解压到c:\vss2svn,将里面的dll文件放入c:\window\System32目录下

5.cmd进入dos窗口,然后输入cd c:\vss2svn

6.输入vss2svn.exe --encoding=gbk --vssdir repo1    //vss database的名字

7.这样在c:\vss2svn目录下就生成了一个dumpfile.dat文件

8,打开visualSVN server Manager,右击repositories,选择importing existing repository,然后选择第二项,load repository from a dump file,找到之前生成的dumpfile.dat文件,就可将project导入到SVN中,VSS中的日志也会保存

猜你喜欢

转载自www.cnblogs.com/cheng2015/p/8975632.html