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
分享到:
相关推荐
Git和Subversion(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的核心区别 #### 版本控制模型的不同 - **SVN**:集中式版本控制系统。所有的数据(包括文件版本、日志、差异等)都存储在一个中心服务器上,用户通过客户端软件与该服务器进行交互。这种方式下,每一...
Git 和 SVN 是两种广泛使用的版本控制系统,它们在软件开发中起着至关重要的作用,帮助团队协同工作并跟踪代码的历史变化。Git 是一个分布式版本控制系统,而 SVN(Subversion)是集中式版本控制系统。以下是关于 ...
Git和SVN的比较 Git和SVN是两个最常用的版本控制系统,它们都是为了帮助开发者更好地管理代码、追踪变化、协作开发而设计的。那么,它们之间有什么区别呢?下面,我们将对Git和SVN进行比较,详细介绍它们各自的优...
在IT行业中,版本控制系统如Git和SVN是用于管理代码版本和协同开发的重要工具。然而,在某些情况下,可能需要从项目文件夹中移除这些版本控制系统的痕迹,比如当你想要分享一个不带版本控制信息的干净工程副本时。...
svn+git实现离线提交并且不需要到处所有svn版本,速度超快非一般的感觉,超越git本身的git2svn功能。 使用本工具需要安装基础工具: 首先安装git msysgit:https://code.google.com/p/msysgit/downloads/list msysgit...
Git 和 SVN 是两种广泛使用的版本控制系统,它们在软件开发中起着至关重要的作用。Git 是一个分布式版本控制系统,由 Linus Torvalds 创建,最初是为了管理 Linux 内核的源代码。而 SVN(Subversion)则是一个集中式...
Git 和 SVN(Subversion)是两种广泛应用的版本控制系统,而Sourcetree和TortoiseSVN/TortoiseGit则是它们的图形化客户端,使得操作更为直观和便捷。下面我们将详细探讨这些工具的功能、使用场景和优势。 1. Git: ...
Git 和 SVN(Subversion)是两种广泛使用的版本控制系统,它们在软件开发中起着至关重要的作用,帮助开发者追踪代码的变化并协同工作。汉化包是为了方便中文用户使用这些工具而提供的本地化版本,使得界面和文档能...
SVN和git的简单介绍,分别说明了git和SVN的工作原理。是能够一直监视代码文件的变更,并存储这些文件以便将来引用的一种机制(软件)
项目开发中代码管理是非常重要的,当前就git和svn占据了市场公司中代码管理的95%以上份额,此套git+svn三套视频教程让你学会这三套,轻松搞定企业中代码管理工作
Git和SVN是两种常用的版本控制系统,用于管理软件开发中的代码变更历史。它们都有各自的优点和适用场景,但在现代开发环境中,Git更为流行。本文将详细介绍如何安装Git和SVN,以及如何在IntelliJ IDEA(简称idea)中...
综上所述,通过配置git-svn、git、svn、github,可以构建一个强大的开发环境,实现SVN和Git的无缝结合,有效弥补SVN在使用中的不足。在具体的工作流程中,如需以SVN库为基础进行开发,可以先克隆SVN库到本地Git库,...
Git和SVN是两种流行的版本控制系统,用于管理软件开发中的源代码。它们都是用来跟踪文件的更改、协作开发以及在不同开发者之间同步代码的重要工具。本文将深入探讨这两种工具的特性、工作原理以及它们在实际开发中的...
### git与svn的主要区别及其优缺点 #### 一、分布式与集中式 - **Git**是一种分布式的版本控制系统。在Git中,每个开发者的工作站都完整地保存了一份完整的项目历史记录,这意味着即使在网络不可用的情况下,...
git2svn提供git到svn的单向同步,基于代码,但做了一些改进,支持更多参数,bash同步脚本使用方法: ./git2svn.sh [-r git_revision] [-t type] [-u svn_user] [-p svn_password] [-l locale] <local> 其中:type参数...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
本资源提供的"MyEclipse10.6_git+svn插件"是针对这个版本的MyEclipse集成的版本控制工具,包括Git和SVN,使得开发者在MyEclipse内部就可以方便地进行版本控制操作。 Git是一种分布式版本控制系统,由Linux创始人...