`
whitesock
  • 浏览: 484074 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Git vs SVN

阅读更多

1 Overview

    Git作为一种Distributed Version Control System,和传统的Contralized Version Control System(例如SVN,CVS)相比存在很多不同之处,以下笔者认为相对来说比较重要的区别。本文提到的SVN版本为1.5,Git版本为1.7.0。

 

2 Differences

2.1 Data Storage

    在每次提交时,SVN都会累加global revision number,同时在Data Store中存储revision间的差异部分;跟SVN相比,Git在提交时会对repository做一个完整的snapshot(一个commit对象,多个tree对象和多个blob对象),并且用一个SHA-1散列值来唯一标识该提交。这也许是Git和SVN最显著的区别之一,因为它影响到了Git很多特性的功能和实现方式。

    默认情况下, svn checkout会创建repository HEAD的一个本地拷贝;git checkout则通常用来切换/创建分支。此外HEAD在SVN和Git中的含义也完全不同:在SVN中HEAD指向最新的revision;在Git中HEAD指向当前的branch。

    在Git中与svn checkout对应的命令是git clone。跟svn checkout不同的是,git clone会创建repository的一个近乎完整的拷贝(Git 不支持SVN 的Sparse Directory特性),该拷贝与原始的repository之间也不是client/server的关系,而是完全平等的关系。

 

2.2 Moving Files

    正如SVN取代CVS的多个原因之一,CVS无文件移动的概念,其后果就是对重构非常不友好。

    SVN记录文件移动的历史。SVN中的peg revision(区别于operative revision)用于唯一确定一个versioned object。

    Git并不跟踪文件的移动。如果你重命名了一个文件,Git并不保存跟移动相关的信息,但是Git可以隐式推测出文件移动。需要注意的是,Git虽然提供了git mv,但是它只是git rm和git add的便捷写法而已。

 

2.3 File Status Cycle

    SVN和Git的working copy中的每个文件,都只能是tracked和untracked两种状态之一。但是跟SVN相比,Git增加了staging area的概念。Staging area虽然在某种程度上增加了Git使用的复杂性(例如git diff默认只是指比对working copy和staging area,git diff --staged/--cached显示staging area中即将提交的变更),但是也提供了更多的灵活性(例如git stash)。

 

2.4 Offline Operations

    CVS基本上不支持离线操作,例如当你希望查看对working copy的修改时,只能使用cvs update,而cvs update依赖remote repository可以访问。

    SVN支持有限的离线操作,这要归功于无处不在的.svn目录中保存的BASE版本。例如通过svn status即可查看对working copy的修改而无须访问remote repository(当然svn status -u例外)。支持离线操作的命令还有svn diff,svn revert。但是,svn list,svn update,svn commit和svn checkout等命令仍然是需要访问remote repository。

    作为一种DVCS,Git支持丰富的离线操作。例如git update、git commit和git merge等命令都支持离线操作。Git中管理remote repository的命令有git remote、git fetch、git pull和git push等。但在能用好这些remoting相关命令之前,首先要充分理解tracking branches的含义,以及git remote show <name> 的用途。

 

2.5 Undoing Things

    SVN中每一次提交的revision都是immutable的,因此SVN对于undo提供有有限的支持。例如在SVN中修改commit message就要颇费周折(需要调整pre-revprop-change hook或者使用svnadmin setlog --bypass-hooks)。

    Git对undo提供了丰富的支持,例如通过interactive rebase,可以调整、合并、分割任意的commit 对象,通过branch-filter可以在每一次commit中删除文件等。

 

2.6 Locking

    SVN支持显式的mutual exclusive lock。Git不支持。需要注意的是,在SVN中并不只是持有锁的用户可以解锁,实际上任何用户都可以解锁(通常称之为breaking and stealing locks)。

 

2.7 Branching and Merging

    严格来讲,SVN不区分tag和branch。在创建tag或者branch时,SVN采用所谓的“cheap copy”(实际上每个revision都是之前revision的cheap copy)。

    Git branching被称为killing feature,因此Git倡导使用branch。在创建一个branch时,Git只需要保存一个指向当前commit对象的pointer即可。

    SVN支持mixed working copy,即working copy的不同目录中包含同一repository的不同分支的内容。在Git中貌似没有类似特性。需要注意的是,如果working copy中有未提交的修改,那么Git不允许切换分支(如果需要保留这些修改,那么应该使用git stash);而svn switch会尝试保留这些修改,并将切换后分支的内容和未提交的修改进行合并。

 

3 Reference

    Pro Git, Scott Chacon

    Version Control with Subversion, Ben Collins-Sussman, Brian W.Fitzpartrik, C.Michael Pilato

 

5
4
分享到:
评论
6 楼 trydofor 2011-03-03  
俺推荐轻量级的hg
5 楼 fujohnwang 2011-02-24  
whitesock 写道
fujohnwang 写道
github

我知道你那个scala的项目是host在github上

我拿来玩的,呵呵, 刚才删了一个
4 楼 whitesock 2011-02-23  
fujohnwang 写道
github

我知道你那个scala的项目是host在github上
3 楼 fujohnwang 2011-02-23  
http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository
2 楼 fujohnwang 2011-02-23  
github
1 楼 leogao_emcom 2011-02-23  
希望以后能用到,仔细研究后,发现比CVS强大多了,支持多样的开发管理方式,非常灵活的东东!

相关推荐

    git和svn学习入门教程

    Git和Subversion(SVN)都是版本控制系统,用于跟踪和管理软件开发中的代码变更。它们在代码管理和协作方面发挥着至关重要的作用。本教程将帮助初学者了解这两者的基础知识,以便选择适合自己的工具。 首先,让我们...

    git-svn使用用法

    git-svn是Git版本控制系统与Subversion(SVN)版本控制系统的桥梁,允许Git用户与SVN仓库进行交互。在一些项目中,由于历史原因可能仍在使用SVN作为中央版本控制系统,而git-svn可以使得开发者在本地使用Git的强大...

    Git与SVN比较

    Git与SVN比较Git与SVN比较Git与SVN比较Git与SVN比较Git与SVN比较Git与SVN比较

    Git-SVN面试题,都是来自工作中的笔记

    ### Git与SVN的核心区别 #### 版本控制模型的不同 - **SVN**:集中式版本控制系统。所有的数据(包括文件版本、日志、差异等)都存储在一个中心服务器上,用户通过客户端软件与该服务器进行交互。这种方式下,每一...

    git_svn.rar

    Git 和 SVN 是两种广泛使用的版本控制系统,它们在软件开发中起着至关重要的作用,帮助团队协同工作并跟踪代码的历史变化。Git 是一个分布式版本控制系统,而 SVN(Subversion)是集中式版本控制系统。以下是关于 ...

    git和svn的比较

    Git和SVN的比较 Git和SVN是两个最常用的版本控制系统,它们都是为了帮助开发者更好地管理代码、追踪变化、协作开发而设计的。那么,它们之间有什么区别呢?下面,我们将对Git和SVN进行比较,详细介绍它们各自的优...

    移除文件夹的Git或SVN信息

    在IT行业中,版本控制系统如Git和SVN是用于管理代码版本和协同开发的重要工具。然而,在某些情况下,可能需要从项目文件夹中移除这些版本控制系统的痕迹,比如当你想要分享一个不带版本控制信息的干净工程副本时。...

    git svn转换工具

    svn+git实现离线提交并且不需要到处所有svn版本,速度超快非一般的感觉,超越git本身的git2svn功能。 使用本工具需要安装基础工具: 首先安装git msysgit:https://code.google.com/p/msysgit/downloads/list msysgit...

    git和svn.zip

    Git 和 SVN 是两种广泛使用的版本控制系统,它们在软件开发中起着至关重要的作用。Git 是一个分布式版本控制系统,由 Linus Torvalds 创建,最初是为了管理 Linux 内核的源代码。而 SVN(Subversion)则是一个集中式...

    git 、svn 代码版本管理工具所有合集.7z

    Git 和 SVN(Subversion)是两种广泛应用的版本控制系统,而Sourcetree和TortoiseSVN/TortoiseGit则是它们的图形化客户端,使得操作更为直观和便捷。下面我们将详细探讨这些工具的功能、使用场景和优势。 1. Git: ...

    git 、svn汉化包

    Git 和 SVN(Subversion)是两种广泛使用的版本控制系统,它们在软件开发中起着至关重要的作用,帮助开发者追踪代码的变化并协同工作。汉化包是为了方便中文用户使用这些工具而提供的本地化版本,使得界面和文档能...

    git和SVN的简介

    SVN和git的简单介绍,分别说明了git和SVN的工作原理。是能够一直监视代码文件的变更,并存储这些文件以便将来引用的一种机制(软件)

    git+svn三套视频教程

    项目开发中代码管理是非常重要的,当前就git和svn占据了市场公司中代码管理的95%以上份额,此套git+svn三套视频教程让你学会这三套,轻松搞定企业中代码管理工作

    git和svn的使用, 安装git和svn, git上传项目, 拉取项目, idea集成git, idea集成svn

    Git和SVN是两种常用的版本控制系统,用于管理软件开发中的代码变更历史。它们都有各自的优点和适用场景,但在现代开发环境中,Git更为流行。本文将详细介绍如何安装Git和SVN,以及如何在IntelliJ IDEA(简称idea)中...

    擅用Git弥补SVN的不足

    综上所述,通过配置git-svn、git、svn、github,可以构建一个强大的开发环境,实现SVN和Git的无缝结合,有效弥补SVN在使用中的不足。在具体的工作流程中,如需以SVN库为基础进行开发,可以先克隆SVN库到本地Git库,...

    git和svn

    Git和SVN是两种流行的版本控制系统,用于管理软件开发中的源代码。它们都是用来跟踪文件的更改、协作开发以及在不同开发者之间同步代码的重要工具。本文将深入探讨这两种工具的特性、工作原理以及它们在实际开发中的...

    git和svn的区别

    ### git与svn的主要区别及其优缺点 #### 一、分布式与集中式 - **Git**是一种分布式的版本控制系统。在Git中,每个开发者的工作站都完整地保存了一份完整的项目历史记录,这意味着即使在网络不可用的情况下,...

    Git2Svn:代码git到svn的单向同步

    git2svn提供git到svn的单向同步,基于代码,但做了一些改进,支持更多参数,bash同步脚本使用方法: ./git2svn.sh [-r git_revision] [-t type] [-u svn_user] [-p svn_password] [-l locale] &lt;local&gt; 其中:type参数...

    rh-git218-git-svn-2.18.2-1.el7.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    MyEclipse10.6_git+svn插件

    本资源提供的"MyEclipse10.6_git+svn插件"是针对这个版本的MyEclipse集成的版本控制工具,包括Git和SVN,使得开发者在MyEclipse内部就可以方便地进行版本控制操作。 Git是一种分布式版本控制系统,由Linux创始人...

Global site tag (gtag.js) - Google Analytics