我应该使用SVN还是Git?[关闭]


321

我正在开始一个新的分布式项目。我应该使用SVN还是Git,为什么?


5
是的,git在Mac上可以使用。如果您使用macports进行安装,它甚至会在提交和浏览界面上安装mac前端。
塞斯·约翰逊


3
@Andre-因为您可以使用MonoDevelop-我从Vault切换到SVN,以便可以在Mac或PC上开发.NET软件。没有Vault的客户,但有SVN的客户:-)
schmoopy 2011年


4
Github / Bitbucket + Sourcetree =天堂!- sourcetreeapp.com
thecodeassassin

Answers:


253

SVN是一个回购协议,有很多客户。Git是一个有很多客户回购的回购,每个客户都有一个用户。它的分散性使人们可以在本地跟踪自己的编辑,而不必将内容推送到外部服务器。

SVN被设计为更加集中,其中Git基于每个拥有自己Git存储库的用户,而这些存储库将更改推回中央。因此,Git为个人提供了更好的本地版本控制。

同时,您可以在TortoiseGitGitExtensions之间进行选择(如果您在自己的客户端GitHub上托管 “中央” git存储库-Windows的GitHub)。

如果您正打算退出SVN,则可能需要评估一下Bazaar。它是具有此分布式元素的下一代版本控制系统之一。它不像git那样依赖POSIX,因此具有本机Windows版本,并且它具有一些强大的开源品牌作为后盾。

但是您可能甚至不需要这些功能。了解分布式VCS的功能,优缺点。如果您需要的不仅仅是SVN产品,请考虑其中之一。如果您不这样做,则可能要坚持使用SVN(当前)的高级桌面集成。


24
也许还可以看看汞(水星)
乔尔

24
自2008年10月以来,情况已经好得多。您可以安装TortoiseGit,获取MSysGit的最新便携式版本,并告诉TortoiseGit在哪里找到它。今天,我刚刚将大型svn仓库移至git,因为svn较差的重命名支持终于使我发疯了。
我们都是莫妮卡(Monica),2010年

4
持续了2年,我们现在有了一些不错的Windows工具。目前,我正在将netbeans与MSysGit一起使用。我也有TortoiseGit的运气。我认为它足以用于生产。考虑在Subversion git中管理简单冲突有多么困难,这是一个巨大的进步。
Keyo

24
我们在Windows上大量使用Git,并且已经有很长时间了。Git在Windows上绝对很棒。
查理·弗罗德

13
@Oli会根据此处的评论和您的经验来更新您的答案(尤其是有关Windows git客户端的答案)。自从编写以来已经过去了2-3年,当前的答案似乎有偏差。
艾米特

111

我从来没有理解过“ git在Windows上不好”的概念。我专门在Windows下开发,而git从来没有任何问题。

我绝对会推荐git而不是subversion;它的用途更加广泛,并且可以以绝对无法实现的方式进行“离线开发”。它几乎可以在每个可以想象的平台上使用,并且具有比您可能会使用的更多的功能。


9
另一方面,我在Windows上的git遇到了很多问题,它对我的​​repo确实造成了奇怪的事情。我使用的是cygwin的最新版本(大约一个月前)。
RomanPlášil09年

7
@Roman:好吧,Cygwin端口与本地win32端口几乎不是同一回事。我希望Cygwin端口的测试少得多……
SamB

49
在我的书中,“比您可能会使用的功能更多”是一个危险信号
BT

26
@BT“红旗”我不同意。我经常发现自己希望有一种做某事的方法,经过一番搜索之后,我发现有一些我不知道的命令可以做到这一点。我也在Windows机器上使用GIT,但尚未遇到任何重大问题。
test123

@ testing123,但是它们并不是“您可能永远不会使用”的功能,因为您实际上最终使用了它们。
mulllhausen

77

这是我对某些重复问题做出的答案的副本,此后便删除了有关Git对SVN的问题(2009年9月)。

更好?除了通常的链接WhyGitIsBetterThanX,它们还不同:

一个是基于便宜的分支机构和标签副本的中央VCS,另一个(Git)是基于修订图的分布式VCS。另请参见VCS的核心概念


第一部分产生了一些误导性的评论,声称这两个程序(SVN和Git)的基本目的是相同的,但是实现起来却大不相同。
为了阐明SVN和Git之间根本区别,让我改写一下:

  • SVN是版本控制的第三个实现:RCS,然后是CVS,最后是SVN,管理版本数据的目录。SVN提供了VCS功能(标记和合并),但是它的标签只是目录副本(像分支一样,除了不“应该”接触标签目录中的任何内容),而且它的合并仍然很复杂,目前基于meta -添加数据以记住已经合并的内容。

  • Git是一种文件内容管理(用于合并文件的工具),已基于提交的DAG(有向非循环图发展成一个真正的版本控制系统,其中分支是数据历史记录的一部分(而不是数据本身) ),而标记是真正的元数据。

说它们没有“根本上的”不同是因为您可以实现相同的目标,解决相同的问题,这是……在许多层面上都是错误的。

  • 如果您有许多复杂的合并,则使用SVN进行合并会更长,并且更容易出错。如果必须创建许多分支,则需要管理它们并合并它们,与SVN相比,使用Git再次容易得多,尤其是在涉及大量文件的情况下(速度变得很重要)
  • 如果您要进行的工作有部分合并,则将利用Git暂存区域(索引)来仅提交所需的内容,将其余的内容存储起来,然后在另一个分支上移动。
  • 如果您需要离线开发...与Git一起使用,您始终可以“在线”使用自己的本地存储库,无论您要遵循其他存储库的工作流程如何。

仍然对该旧(已删除)答案的评论坚持:

VonC:您在实现方面存在根本的差异(差异是非常根本的,我们俩都明确同意这一点)。
它们都是用于同一目的的工具:这就是为什么许多以前使用SVN的团队都能够成功地将其转交给Git的原因。
如果他们不能解决相同的问题,那么这种可替代性将不存在。

,我回答了:

“可替换性” ...一个有趣的术语(在计算机编程中使用)。
当然,Git几乎不是SVN的子类型。

您可能同时实现了相同的技术功能(标签,分支,合并),但是Git并没有妨碍您,而是让您专注于文件的内容无需考虑工具本身就。

当然,您不能(总是)仅用Git替换SVN,而无需更改该程序的任何期望属性(正确性,执行的任务等)(这是对上述可替换性定义的引用):

  • 一个是扩展的修订工具,另一个是真正的版本控制系统。
  • 一个适合中小型整体项目,具有简单的合并工作流程和(不是太多)并行版本。SVN足以满足此目的,您可能不需要所有的Git功能。
  • 另一个允许基于多个组件的中型到大型项目(每个组件一个回购),在复杂的合并工作流中的多个分支之间要合并的文件数量很多,分支中的并行版本,改造合并等等。您可以使用SVN来做到这一点,但是使用Git则要好得多。
    SVN根本无法使用任何合并工作流来管理任何规模的任何项目。git可以。

同样,它们的本质从根本上是不同的(这将导致不同的实现,但这不是重点)。
一个人将修订控制视为目录和文件,另一个人仅看到文件的内容(以至于空目录甚至都不会在Git中注册!)。

通用最终目标可能是相同的,但是您不能以相同的方式使用它们,也不能解决相同类别的问题(范围或复杂性)。


10
我不同意git和svn根本不同的观点,但是我确实不同意您的许多观点。svn可能是用来代替cvs的,但是它们之间并没有任何关系,而cvs是作为RCS之上的脚本启动的,因此存在直接关系。不过,您所引用的人是完全正确的,他们从根本上管理文件的修订,实现以及发生的过程(或实现过程)都是实现细节。就像CRC和SHA1之间的区别,本质上是非常不同的,但是它们的作用相同。
Erik Funkenbusch

37

SVN的2个关键优势很少被提及:

  1. 大文件支持。除了代码之外,我还使用SVN来管理我的主目录。SVN是唯一不会使TrueCrypt文件阻塞的VCS(无论是否分布式)(如果还有另一个VCS有效处理500MB +文件,请更正我)。这是因为流比较比较(这是非常重要的一点)。Rsync是不可接受的,因为它不是2路的。

  2. 部分存储库(子目录)检出/检入。Mercurial和bzr不支持此功能,而git的支持很有限。这在团队环境中是不好的,但是如果我想从主目录在另一台计算机上签出某项东西,这将是非常宝贵的。

只是我的经验。


6
“如果还有另一个VCS有效处理500MB +文件,请纠正我”-当然是Perforce!
james creasy

8
Perforce =非免费。另外,Perforce并非适用于所有平台。
WhyNotHugo 2010年

4
为什么不将SVN存储库放在truecrypt容器中?您也可以通过ssh进行隧道传输,并配置服务器以将该特定存储库存储在另一个truecrypt文件中。这具有额外的优势,您可以对该存储库进行部分检出。
WhyNotHugo 2010年

1
@Hugo据我所知,Perforce客户端可用于Windows,Unix,Linux变体,Mac,Amiga,BeOS,Cygwin,HPUX,IBM AS / 400,OS / 2,DEC VMS和Novell File Server。列表中是否缺少一些相关平台?
eis 2012年

1
是的,OpenBSD(我从经验中知道这一点,不需要用Google搜索)。我想它也不能在maemo上运行,尽管我可能错了(是的,我在emo上使用git)。
WhyNotHugo 2012年

25

在进行了更多研究之后,并查看了以下链接:https : //git.wiki.kernel.org/articles/g/i/t/GitSvnComparison_cb82.html

(以下摘录):

  • 它的速度非常快。我使用过的其他SCM都无法跟上它,并且我使用了很多,包括Subversion,Perforce,darcs,BitKeeper,ClearCase和CVS。
  • 它是完全分布式的。存储库所有者无法决定我的工作方式。我可以在断开与笔记本电脑的连接时创建分支并提交更改,然后将其与任意数量的其他存储库同步。
  • 同步可以在许多媒体上发生。SSH通道,通过WebDAV通过HTTP,FTP或通过发送包含补丁的电子邮件发送,该补丁将由消息的接收者应用。中央存储库不是必需的,但可以使用。
  • 分支甚至比Subversion中的便宜。创建分支就像将41个字节的文件写入磁盘一样简单。删除分支就像删除该文件一样简单。
  • 与Subversion不同,分支具有完整的历史记录。无需执行奇怪的副本并遍历副本。使用Subversion时,我总是发现查看创建分支之前发生的分支上文件的历史记录很尴尬。来自#git:矛:我不了解该页面中关于SVN的一件事。我在SVN上创建了一个分支,浏览历史记录显示了整个历史记录在该分支中
  • 在Git中,分支合并更简单,更自动化。在Subversion中,您需要记住合并的最新修订版本,以便生成正确的合并命令。Git自动执行此操作,并且始终正确执行。这意味着将两个分支合并在一起时犯错的可能性较小。
  • 分支合并记录为存储库正确历史记录的一部分。如果我将两个分支合并在一起,或者将一个分支合并回它来自的主干,则该合并操作将记录为重新发布历史的一部分,如由我执行的记录以及何时执行的记录。很难确定在日志中何时由谁执行了合并。
  • 创建存储库是一项简单的操作:mkdir foo; cd foo; git init就是这样。这意味着我最近为所有内容创建了一个Git存储库。我倾向于在每个班级使用一个存储库。这些存储库中大多数都在磁盘中,不到1 MB,因为它们仅存储讲义,家庭作业和我的LaTeX答案。
  • 存储库的内部文件格式非常简单。这意味着修复非常容易,但是更好,因为修复是如此简单,很难被损坏。我认为没有人曾经有过Git存储库被破坏。我已经看到带有fsfs的Subversion本身已损坏。而且我已经看到Berkley DB自身损坏太多次了,无法将我的代码信任到Subversion的bdb后端。
  • 尽管Git的文件格式非常简单,但它非常擅长压缩数据。Mozilla项目的CVS存储库约为3 GB;Subversion的fsfs格式约为12 GB。在Git中约为300 MB。

阅读完所有这些内容后,我确信Git是必经之路(尽管存在一些学习上的困难)。我也在Windows平台上使用过Git和SVN。

阅读以上内容后,我想听听其他人怎么说?


15
Git在某些操作上非常快,主要是因为该操作仅影响您的本地存储库。一次Git签,例如,不应该理直气壮地比作一个SVN签,因为SVN签也变更为您的团队的其他成员登台库的推动。这需要网络命中,并且将Git的无网络承诺与不适当比较的网络传输痕迹进行比较。如果提交,然后丢失了硬盘驱动器,则使用Git会丢失所做的更改。如果这是您不断期望的结果,那很好,但是在非分布式SCM中却不是期望的。
Edwin Buck

1
@EdwinBuck不考虑Waqar所做的事情,即使在考虑网络时间的情况下进行测试,git也会更快:git-scm.com/about/small-and-fast
Sqeaky

您的“创建存储库是一个微不足道的操作”点的极端重要,特别是在Windows上:相比SVN,它更容易快速地模拟了一堆相互连接的分布式回购,都conected到中央(--bare)回购使用Git比它与SVN相似(安装Windows SVN服务器应用程序等)。同样(非常),我发现Git在各个操作系统之间更加一致:命令行设计得非常好,因此与各种SVN本机客户端/服务器应用程序相比,大多数时间(在各个操作系统之间几乎完全相同)...
Shivan Dragon

1
您引用的Wiki文章充满了错误。因此,您的答案是错误的。不赞成投票。Wiki上有一个指向svnvsgit.com的讨论页面,告诉您比较为什么是错误的。
bahrep 2015年

快得惊人吗?我已将ciforth项目从本地cvs移至github。这是一个简单的项目,但是有一个包含10,000行的大型主源文件。如果我尝试对此文件使用非指责,则github会超时。通常,如果一个人不满足于快速地说,并坚持使用这样的限定词,那并不是一种平衡的观点,这使我对您所说的一切感到怀疑。Groetjes Albert
阿尔伯特·凡德·霍斯特,

12

我将建立一个Subversion存储库。通过这种方式,各个开发人员可以选择使用Subversion客户端还是Git客户端(带有git-svn)。使用git-svn并不能给你所有提供完整的Git解决方案的好处,但可以为单个开发人员提供对自己工作流程的大量控制。

我相信Git在Windows上能够像在Unix和Mac OS X上一样好运行的时间相对较短(根据您的要求)。

Subversion具有适用于Windows的出色工具,例如用于Explorer Explorer集成的TortoiseSVN和用于Visual Studio集成的AnkhSVN。


11

有趣的是:我在Subversion Repos中托管项目,但是通过Git Clone命令访问它们。

请阅读在Google Code项目上使用Git开发

尽管Google Code的母语是Subversion,但是您可以在开发过程中轻松使用Git。搜索“ git svn”表明这种做法很普遍,我们也鼓励您尝试一下。

在Svn存储库上使用Git给我带来了好处:

  1. 我可以在多台计算机上进行分布式工作,并在它们之间进行提交和拉取
  2. 我有一个中央 backup/public svn存储库供其他人签出
  3. 他们可以自由使用Git

3
请注意:自2011年7月起,Google Code本地支持Git。
杰里米·萨尔文

9

并没有真正回答您的问题,但是如果您希望获得分布式修订控制的好处-听起来像您一样-并且您正在使用Windows,那么我认为最好使用Mercurial而不是Git,因为Mercurial具有更好的Windows支持。Mercurial确实也有Mac端口。


9

如果您的团队已经熟悉cvs或svn等版本和源代码控制软件,那么对于一个简单的小型项目(例如您声称的那样),我建议您坚持使用SVN。我真的对svn感到满意,但是对于我目前在django上进行的电子商务项目,我决定使用git(我在svn模式下使用git,也就是说,使用了我推送和拉取的集中式仓库以与至少一位其他开发人员合作)。另一个开发人员对SVN感到满意,尽管其他人的经验可能有所不同,但对于这个小项目,我们两个人在拥抱git时都经历了非常糟糕的时光。(如果有关系的话,我们都是Linux核心用户。)

当然,您的里程可能会有所不同。


8

绝对可以svn,因为Windows充其量是世界上第二等的公民git(有关更多详细信息,请参见http://en.wikipedia.org/wiki/Git_(software)#Portability)。

更新:很抱歉断开的链接,但是我已经放弃了让SO使用包含括号的URI的尝试。[现在已修复链接。-ed]


1
仅供参考:将网址括在尖括号中,或将括号替换为%28和%29。
披披(FhiLho)

1
URL编码是否适用于[]()语法?
汉克·盖伊

16
这是不正确的FUD。Git在Windows上很棒。SVN到处都很糟糕。
查理·弗罗德

6
对于所有讨厌我的人,请回头看看大约2008年的开发人员评论:很明显,Linus和帮派并不关心支持Windows。很好:我也不是想要这样做,而且我的软件并不像VCS那样复杂,它期望文件系统具有POSIXish行为。但是,如果您看上下文,将我的陈述描述为FUD似乎是不公平的。
汉克·盖伊

2
也许在2008年git在Windows上表现不佳,但自2009年以来我一直在使用msysgit,它可以完美运行。其中包括gitk,它是GitHub的离线桌面。
Dan Dascalescu 2011年

8

要点是,Git是分布式VCS,Subversion是集中式VCS。分布式VCS有点难以理解,但具有许多优点。如果您不需要此优点,则Subversion可能是更好的选择。

另一个问题是工具支持。您计划使用哪些工具更好地支持哪个VCS?

编辑:三年前,我以这种方式回答:

目前,Git仅可通过Cygwin或MSYS在Windows上运行。Subversion从一开始就支持Windows。由于Windows的git解决方案可能适合您,因此可能会出现问题,因为大多数Git开发人员都使用Linux,并且从一开始就没有可移植性。目前,我希望在Windows下使用Subversion进行开发。几年后这可能无关紧要。

现在,世界已经发生了一些变化。Git现在在Windows上有很好的实现。尽管我没有在Windows上进行彻底的测试(因为我不再使用该系统),但我很有信心,所有主要的VCS(SVN,Git,Mercurial,Bazaar)现在都具有正确的Windows实现。SVN的这一优势消失了。其他要点(集中式与分布式以及对工具支持的检查)保持有效。


我感到乐观的是,无关紧要的时间将短于几年。
格雷格(Greg Hewgill)

是的,可能只有一年。Git具有动态的开发社区。但是颠覆也有。一两年之内,您将不得不再次查看两者,以回答此问题。
Mnementh,

1
现在过了一两年。看起来怎么样 :)
Merlyn Morgan-Graham

3
Git缺乏将分布式SCM模型扩展到软件开发管道的其他阶段的功能。对于分布式发布构建系统,分布式自动化测试,质量控制,发布控制等,我们没有一个好的模型。经过数十年的研究,我们刚刚获得了对分布式备份的实验性支持。这样,Git为开发人员提供了更多的东西,而为软件开发过程提供了更少的东西。所有Git实施最终都会使一个仓库成为中心仓库,从而将最有趣的Git功能简化为SVN的传真。
埃德温·巴克

1
@hibbelig Git没有中央存储库,每个存储库(由于其分布式设计)实际上是相等的。这意味着您要么重新制作生产管道以可能均等地处理所有存储库,要么人为地使一个存储库处于“人为提升”状态(又称为中央存储库)。如果您使用前者,那么对于建立并行管道以从任何开发人员的办公桌发布可能没有多大了解,如果您使用后者,则分布式处理的承诺会受到集中式约定的欺骗。
Edwin Buck


4

Windows目前还不支持Git。它针对Posix系统进行了优化。但是,运行Cygwin或MinGW可使您成功运行Git。

如今,相对于SVN,我更喜欢Git,但如果您来自SVN领域的CVS,则需要花费一些时间才能超过阈值。


8
定义“本地”。msysgit工作得很好
米兰·巴布斯科夫(MilanBabuškov)

4

我可能会选择Git,因为我觉得它比SVN强大得多。有便宜的代码托管服务可用,对我来说非常有用-您不必进行备份或任何维护工作-GitHub是最明显的选择。

就是说,我对Visual Studio和其他SCM系统的集成一无所知。我想象与SVN的集成要好得多。


4

我使用SVN已有很长时间了,但是每当使用Git时,我都觉得Git功能强大,轻巧,虽然涉及到一点学习曲线,但比SVN更好。

我注意到的是,每个SVN项目都会随着其增长而变成一个很大的项目,除非将其导出。另外,GIT项目(以及Git数据)的大小非常轻。

在SVN中,我与从新手到专家的开发人员打交道,如果新手和中级从另一个SVN项目复制一个文件夹以重新使用它,则新手和中间人似乎会引入文件冲突。而我认为在Git中,您只需复制文件夹即可使用,因为Git不会在其所有子文件夹中引入.git文件夹(就像SVN一样)。

经过很长时间与SVN的交易之后,我终于考虑将我和我的开发人员转移到Git,因为它很容易协作和合并工作,并且一个很大的优点是可以尽可能多地执行本地副本的更改。期望,然后最终一次将其推送到服务器上的分支,这与SVN不同(我们必须不时在服务器上的存储库中提交更改)。

有谁可以帮助我决定我是否应该真正使用Git?


我不会叫任何将SVN受控文件夹复制到另一个项目中的开发人员来重复使用它,并且不希望出现明显的麻烦“中间”。我称他们为新手。是的,您是对的,这是由于.svn子文件夹告诉SVN文件所属的存储库。如果用户删除了该.svn子文件夹,则他们可以将该文件夹导入到新的SVN项目中。我本人仍在使用SVN,但我的需求很少。GIT非常适合大型项目。
dyasta 2012年

3
最新的svn客户端不需要.svn在每个子目录中都有一个文件夹。可以在复制错误发生之前“修复”复制错误。
Edwin Buck

4

归结为:

您的发展会线性吗?如果是这样,则应坚持使用Subversion。

另一方面,如果您的开发不是线性的,这意味着您将需要为不同的更改创建分支,然后将这些更改合并回主开发线(称为Git的主分支),那么Git会做还有更多为您服务。


3

你尝试过Bzr吗?

非常好,因为他们不喜欢市场上的其他东西,所以(由Ubuntu的人创建的)令人反感。


但是,Windows支持确实需要一些工作。并不是什么让我在Windows下最近进行的所有编程中我并没有很愉快地使用它(我已经做了相当多的事情),还是什么,但是还是……
SamB

人们几乎100%的时间都在使用OS,因为人们“之所以开发它(任何软件)是因为他们不喜欢市场上的其他产品”。
WhyNotHugo 2010年

@Hugo使用开源,如果他们喜欢市场上的其他产品,他们会为它做出贡献,而不是制造新产品。
2011年

这根本不是问题的答案
Albert van der Horst

@AlbertvanderHorst不,不是这样,在SO的狂野西部时代,没有人知道更好的答案,这个问题得到了回答,并提供了另一种选择。匆忙地争论着,看来我也拼错了Canonical的名字。真可惜!
奥马尔·库赫吉

3

我可以扩展一下这个问题,并询问Git在MacOS上是否运行良好?

回复评论:感谢您的消息,我一直期待尝试。我将在Mac上在家安装它。


1
是的,它工作得很漂亮。我是通过MacPorts安装的,每天都使用。
格雷格(Greg Hewgill)

是的 在任何基于POSIX的系统(Unix,Linux,Solaris,BSD等)上,它都很棒。问题所在实际上只是Windows。
奥利(Oli)

git-gui和gitk在OS-X下的工作方式可能与Linux和Windows下的相同。与tortoiseSVN相反,哪个AFAIK仅适用于Windows?
David Schmitt

@David Schmitt:好吧,tortoisesvn.tigris.org称它为“ Subversion的Windows Shell扩展”,所以我想是的,是;-)。
SamB

@Robert:您在OS X上使用git的经验如何?
David Schmitt


2

正如其他人指出的那样,在Windows下SVN似乎是一个不错的选择。

如果您的某些开发人员想要尝试GIT,则它可能总是使用GIT-SVN,其中在GIT存储库中重新创建了SVN存储库。然后,他应该能够在本地使用GIT,然后使用SVN将其更改发布到主存储库。


1

您必须使用DVCS,这就像源管理中的一次飞跃。我个人使用Monotone,它加速了开发时间,没有止境。我们将其用于Windows,Linux和Mac,它非常稳定。我什至让buildbot在每个平台上每晚进行项目构建。

分发时,DVCS通常意味着您将创建一个中央服务器,仅用于人们来回推送更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.