为什么Git比Subversion更好?

我已经使用了Subversion几年,在使用SourceSafe之后,我只喜欢Subversion。 结合TortoiseSVN,我无法真正想象它会如何更好。

然而越来越多的开发者声称Subversion存在问题,我们应该转向分布式版本控制系统的新品种,比如Git。

Git如何改进Subversion?


Git并不比Subversion好。 但也不会更糟。 这不一样。

关键的区别是它是分散的。 想象一下,你是一名开发人员,在笔记本电脑上开发,并且希望拥有源代码控制权,以便可以返回3小时。

使用Subversion,你有一个问题:SVN信息库可能位于一个你无法访问的位置(在你的公司,而你目前没有互联网),你不能提交。 如果你想复制你的代码,你必须从字面上复制/粘贴它。

使用Git,你没有这个问题。 您的本地副本是一个存储库,您可以承诺它并获得源代码管理的所有好处。 当您重新获得与主存储库的连接时,可以对其进行提交。

这看起来不错,但要记住这种方法增加了复杂性。

Git似乎是“新的,有光泽的,酷”的东西。 这绝对不是坏事(因为Linus为Linux内核开发写了一个理由),但是我觉得很多人跳过“分布式源代码控制”列车,只是因为它是全新的,并且由Linus Torvalds编写,而没有实际上知道为什么/如果它更好。

Subversion有问题,但Git,Mercurial,CVS,TFS或其他。

编辑:所以这个答案现在已经过去了一年,并且仍然会产生很多upvotes,所以我想我会添加更多的解释。 在写这篇文章的最后一年,Git获得了很多动力和支持,尤其是在GitHub这样的网站真正起飞之后。 我现在使用Git和Subversion,我想分享一些个人见解。

首先,当分散工作时,Git可能会让人感到困惑。 什么是遥控器? 以及如何正确设置初始仓库? 是一开始就提出的两个问题,尤其是与SVN简单的“svnadmin create”相比,Git的“git init”可以采用参数--bare和--shared,这似乎是“正确”设置集中的方式库。 这是有原因的,但它增加了复杂性。 “checkout”命令的文档对于人们转换非常困惑 - “正确”的方式似乎是“git clone”,而“git checkout”似乎改变了分支。

当你分散时Git真的会闪耀。 我在家里有一台服务器,路上有一台笔记本电脑,而SVN在这里根本不能很好地工作。 使用SVN,如果我没有连接到存储库(我知道关于SVK或关于复制回购的方法),我不能拥有本地源代码控制。 使用Git,无论如何这都是默认模式。 这是一个额外的命令(git commit在本地提交,而git push origin master将主分支推送到名为“origin”的远程)。

如上所述:Git增加了复杂性。 创建存储库,检出与克隆,提交与推送两种模式......你必须知道哪些命令在本地工作,哪些与“服务器”一起工作(我假设大多数人仍然喜欢中央“主存储库” )。

此外,工具仍然不足,至少在Windows上。 是的,有一个Visual Studio AddIn,但我仍然使用msysgit的git bash。

SVN的优点是学习起来要简单得多:如果你知道如何创建,提交和签出,那么你的存储库和所有的变化都是针对它的,并且你准备好了以后能够像分支,更新等那样获取内容上。

如果一些开发人员并不总是连接到主存储库,那么Git的优势在于它更适合。 而且,它比SVN快得多。 从我所听到的来看,分支和合并的支持要好得多(这是可以预料的,因为这是它写的核心原因)。

这也解释了为什么它会在互联网上获得如此多的热门话题,因为Git非常适合开源项目:只需将它分叉,将您的更改提交到您自己的Fork,然后让原始项目维护人员进行修改。 有了Git,这只是起作用。 真的,在Github上试试它,这很神奇。

我还看到的是Git-SVN Bridges:中央存储库是一个Subversion回购,但开发人员在本地使用Git,然后桥接器将其更改推送到SVN。

但即使有这么长时间的补充,我仍然坚持我的核心信息:Git不会更好或更糟,它只是不同而已。 如果您需要“离线源代码管理”并且愿意花费额外的时间学习它,那太棒了。 但是,如果你有严格集中的源代码管理和/或努力引入源代码管理,因为你的同事不感兴趣,那么SVN的简单和优秀的工具(至少在Windows上)闪耀。


有了Git,你几乎可以离线执行任何事情,因为每个人都有自己的存储库。

分支之间的合并和分支之间的合并非常简单。

即使您没有项目的提交权限,您仍然可以使自己的存储库联机,并为您的补丁发布“推送请求”。 每个喜欢你的补丁的人都可以将他们拖入他们的项目中,包括官方维护者。

分叉一个项目,修改它,并且仍然保持合并在来自HEAD分支的错误修正中是微不足道的。

Git适用于Linux内核开发人员。 这意味着它非常快(它必须是),并且可以扩展到成千上万的贡献者。 Git也占用更少的空间(Mozilla存储库的空间减少了30倍)。

Git非常灵活,非常有TIMTOWTDI(有多种方法可以做到这一点)。 你可以使用你想要的任何工作流程,Git将支持它。

最后,还有GitHub,一个用于托管Git存储库的好网站。

Git的缺点:

  • 学习起来很难,因为Git有更多的概念和更多的命令。
  • 修订版没有版本号,就像在Subversion中一样
  • 许多Git命令都是神秘的,错误消息对用户非常不友好
  • 它缺少一个好的GUI(如伟大的TortoiseSVN)

  • 其他答案在解释Git的核心特性方面做得很好(这很好)。 但也有很多小方法让Git的表现更好,并有助于让我的生活更加健康。 以下是一些小东西:

  • Git有一个'干净'的命令。 SVN迫切需要这个命令,考虑它会多次转储磁盘上的额外文件。
  • Git有'平分'命令。 这真好。
  • SVN在每个文件夹中创建.svn目录(Git只创建一个.git目录)。 你写的每一个脚本,以及你所做的每一个grep,都需要写出来忽略这些.svn目录。 你还需要一个完整的命令(“svn export”)才能得到你的文件的一个合理的副本。
  • 在SVN中,每个文件和文件夹可以来自不同的版本或分支。 起初,拥有这种自由听起来不错。 但是,这实际上意味着你的本地结账有一百万种不同的方式被完全搞砸了。 (例如,如果“svn switch”中途失败,或者输入命令错误)。 最糟糕的部分是:如果你遇到过一些文件来自一个地方,其中一些来自另一个地方的情况,“svn status”会告诉你一切正常。 您需要在每个文件/目录上执行“svn info”来发现奇怪的事情。 如果“git status”告诉你事情是正常的,那么你可以相信事情确实是正常的。
  • 无论何时移动或删除东西,您都必须告诉SVN。 Git会解决它。
  • 在Git中忽略语义更容易。 如果你忽略一个模式(比如* .pyc),它将被所有子目录忽略。 (但是,如果你真的想忽略只有一个目录的东西,你可以)。 使用SVN,似乎没有简单的方法来忽略所有子目录中的模式。
  • 另一项涉及忽略文件。 Git可以让“私人”忽略设置(使用文件.git / info / exclude),这不会影响其他任何人。
  • 链接地址: http://www.djcxy.com/p/37515.html

    上一篇: Why is Git better than Subversion?

    下一篇: How do you organize your version control repository?