Popularity of Git/Mercurial/Bazaar vs. which to recommend
按照这三个分布式版本控制系统在这个站点上的问题的数量来看,Git似乎也是
或者可能是三者的结合。(假设此网站的人气相当于总体人气。)以下是数字:
。氧化镁
有三种相互竞争但基本上相当的开源产品可供选择,这并不完全令人满意。就我个人而言,我使用Git,我和另外两个没问题。但是,当涉及到推荐一个系统而不是其他系统时,我想问:我们能安全地开始推荐一个吗?
2009年年中的评论:最近颠覆运动的历史流行程度明显反映在问题的数量上,这表明在变化莫测的市场或集市上,至少有一小部分规模向Git倾斜。
2010年年中的评论:看看那些相对增加的巨幅反复无常的数字。显然,只有两个数据点不足以显示一种趋势,但看起来Git和Subversion基本上是根深蒂固的,Mercurial已经看到了大量增长,Bazaar仍然相对平静。
简要评论,2011年年中:我们可以叫吉特为赢家吗?
复制上述绘图的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import datetime as dt import matplotlib.pyplot as plt dates = [ "01/06/2009", "01/07/2010", "01/07/2011", "01/07/2012", "01/07/2013", "01/07/2014", "01/07/2015", "01/07/2016", "01/06/2017", "28/08/2018", "27/05/2019" ] x = [dt.datetime.strptime(d,"%d/%m/%Y").date() for d in dates] git = [726, 3725, 9225, 17523, 27862, 41478, 55315, 71056, 86958, 102362, 110970] svn = [2353, 5323, 9028, 12687, 15587, 18846, 21209, 23037, 24692, 25525, 25868] mercurial = [169, 1120, 2765, 4221, 5230, 6030, 6651, 7134, 7524, 7765, 7894] bazaar = [50, 159, 252, 351, 425, 483, 506, 525, 534, 539, 544] ax = plt.gca() ax.grid() plt.plot(x, git, label="[git]") plt.plot(x, svn, label="[svn]") plt.plot(x, mercurial, label="[mercurial]") plt.plot(x, bazaar, label="[bazaar]") plt.gcf().autofmt_xdate() plt.ylabel("number of tags on stackoverflow") plt.ylim(0) plt.legend() # plt.show() plt.savefig("comparison.png", transparent=True, bbox_inches="tight") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import datetime as dt import matplotlib.pyplot as plt dates = [ "01/06/2009", "01/07/2010", "01/07/2011", "01/07/2012", "01/07/2013", "01/07/2014", "01/07/2015", "01/07/2016", "01/06/2017", "28/08/2018", "27/05/2019" ] x = [dt.datetime.strptime(d,"%d/%m/%Y").date() for d in dates] git = [726, 3725, 9225, 17523, 27862, 41478, 55315, 71056, 86958, 102362, 110970] svn = [2353, 5323, 9028, 12687, 15587, 18846, 21209, 23037, 24692, 25525, 25868] mrc = [169, 1120, 2765, 4221, 5230, 6030, 6651, 7134, 7524, 7765, 7894] bzr = [50, 159, 252, 351, 425, 483, 506, 525, 534, 539, 544] n = len(dates) intervals = [x[i+1] - x[i] for i in range(n-1)] git_per_day = [(git[i+1] - git[i]) / intervals[i].days for i in range(n-1)] svn_per_day = [(svn[i+1] - svn[i]) / intervals[i].days for i in range(n-1)] mrc_per_day = [(mrc[i+1] - mrc[i]) / intervals[i].days for i in range(n-1)] bzr_per_day = [(bzr[i+1] - bzr[i]) / intervals[i].days for i in range(n-1)] ii = [0] + [val for val in range(1, n-1) for _ in (0, 1)] + [n-1] jj = [val for val in range(n-1) for _ in (0, 1)] ax = plt.gca() ax.grid() plt.plot([x[i] for i in ii], [git_per_day[j] for j in jj], label="[git]") plt.plot([x[i] for i in ii], [svn_per_day[j] for j in jj], label="[svn]") plt.plot([x[i] for i in ii], [mrc_per_day[j] for j in jj], label="[mercurial]") plt.plot([x[i] for i in ii], [bzr_per_day[j] for j in jj], label="[bazaar]") plt.gcf().autofmt_xdate() plt.ylabel("average daily tags on stackoverflow") plt.legend() plt.ylim(0) # plt.show() plt.savefig("comparison-daily.png", transparent=True, bbox_inches="tight") |
号
2011年11月更新:
Git现在比2009年成熟得多:
- 现在支持智能HTTP,这意味着您可以向客户机提供用于拉/克隆和推送的HTTPS协议,并且具有与LDAP接口的身份验证(对于企业中的用户很重要)
- Gitolite现在有了一个成熟的授权层,这意味着您可以为"机密"存储库提供隔离(同样,对于大公司很重要)。
- Windows的支持在2009年就已经存在了,现在仍然很强大,TortoiseGit也相当稳定。
- 与类似于IDE的Eclipse的集成正在进行中(大多数Eclipse项目现在都在Github上)
但是,在集中环境中安装Git并不容易:参见"分布式版本控制系统和企业-一个好的组合?"
有一点经常被忽略:
它们的性质不同。
- SVN是一个修订系统(它只通过便宜的拷贝存储分支和标签!合并支持不是很有效),它是集中的。
- Mercurial或Bazaar是文件VCS(它们存储文件版本),并且是分布式的。ArneBabenhauserheide通过指出Mercurial的历史模型跟踪内容更改来修正Mercurial的这一点,并在存储层中重新使用文件路径来优化文件系统访问。
- Git是一个内容VCS(它存储内容增量,而不是文件本身:两个内容相同的文件只存储一次)。
这意味着:
- 如果您有一个简单的合并工作流,在单个开发位置,请使用SVN。
- 如果您有几个开发位置,分布式VCS更适合。
- 如果您有一个复杂的合并工作流程,那么任何现代的VCS都比那些多年来一直努力将合并信息保持在正确位置的SVN要好。然后取决于工具(例如,Mercurial支持更高级的Windows)
- 如果您主要使用文本文件,而不是太大的二进制文件,那么Git非常优秀,前提是您了解它的限制。
Going by the number of questions on this site for these three distributed version control systems, it seems like Git either
is more popular, or is more difficult (hence requiring more questions), or has more features (hence requiring more questions).
号
关于SCM的流行性——请参见下面的stackoverflow问题:对于免费的rcs/scm/vcs系统,有没有可用的流行性/使用统计数据?在这里,我们有一些问题,比如要为特定类型的项目使用哪一组忽略文件,这些文件是不可知的,但是要求使用git(并使用"git"标记),因为提出问题的人使用它。
关于Git的难度更大(因此对So有更多的疑问)——当然Git的学习曲线更陡。它还使用了一些(相当)独特的概念,比如临时区域(索引),或者所有的分支都是相等的,它们负责它的功能,但一开始可能很难正确地进行(特别是如果一个分支来自其他的SCM)。此外,GitUI并不完全一致(尽管它会变得更好),因为它是成长的,而不是开发出来的;这是它的强大功能,但可能导致用户界面不理想。
关于Git有更多的特性——您必须检查有多少这样的问题是关于Git的高级/不常见特性的。但是,您应该知道,开放源码项目相互借用思想,或者独立开发类似的功能:一个例子是通过将提交的历史分为(搜索)两部分来发现bug,这引入了bug,这个bug(据我所知)是在Git中首先开发的,然后在Bazaar中作为插件实现的,并且是第一个扩展。目前是Mercurial的核心功能。另一种方法是交互选择要提交的变更片段,受DARC行为的启发。另一个可能是Git的捆绑概念,借鉴了Mercurial的类似概念。
另一个可能的来源更多的所以问题可能是缺乏良好的文件…尽管现在Git用户手册(与Git一起分发)和Git社区手册(在Git主页上找到)的使用情况有所改善。不过,还有一个持久的模因,Git的文档比,比方说,使用Subversion(也称为Svnbook)和Mercurial:The Determinal Guide(也称为Hg Book)进行版本控制的Subversion更糟糕。有时,人们在询问StackOverflow问题之前不会阅读文档。
It's not entirely satisfactory having three competing yet largely equivalent open source products to choose from. Personally I use Git and I'm fine with the other two. But when it comes to recommending one system over the others, I'd like to ask: can we start recommending one safely yet?
号
好吧,Git和Mercurial几乎是在同一时间独立开发的,作为对Linux内核开发人员使用的BitKeeper的免费许可证终止的响应,作为它的替代。颠覆作为集中式的单片机是不可能的,核心对合并跟踪缺乏支持,这使得它完全不适合Linux内核的大分布式开发模式。集市可能太慢了(至少在那时),有点集中(我猜)。
Git是更强大的(在我看来),水星是更简单的(在人们的意见)和一个更便携(Python);Git是可脚本化的并且基于允许独立的重新实现的数据模型(参见例如JGIT,Java编写的Git),而MyurialPython绑定用于编写扩展,并且主要基于API允许底层的改变。Ying存储库格式(revlog-revlog ng)…但这只是我的猜测。它们填补了稍有不同的壁龛。
另外,没有选择是件好事吗?我们有kde和gnome和xfce(以及其他窗口管理器和桌面环境);我们有emacs和vim(以及其他程序员的编辑器);我们有基于RPM的(例如Fedora Core、Mandriva、Suse)和基于DEB的(Debian、Ubuntu)和基于TGZ的(Slackware)和基于源代码的(Gentoo)发行版;我们有kword、abiword和openoffice.org…我们有Git,Mercurial和Bazaar。
我使用并推荐Mercurial
- 而不是颠覆,因为它支持分布式开发。我可以在几台机器上工作并在本地提交。对于Subversion,你不能这样做,至少不能像其他存储库那样没有翻筋斗。
- 而不是Bazaar,因为Bazaar的Windows支持是…好。
- 而不是Git,因为它a)学习和使用更简单b)Windows支持更好
根据我的经验,从问题的数量来看,这明显扭曲了与Git和Mercurial的对比。原因有两方面:
看看
查看mercurial wiki-如果您需要帮助,您可能会在那里找到它,包括许多提示和技巧:http://mercurial-scm.org/wiki/tipsandtricks
[注:随着Subversion 1.7的发布,下面我的答案中的第一段已经过时,因为Subversion现在只在基本文件夹中创建一个".svn"文件夹,与其他文件夹类似。]
与Subversion相比,这三个文件夹的一个优点是,它不会在项目的每个文件夹中创建一个与".svn"文件夹等效的文件夹。通常在基本文件夹中只有一个(".hg"、".bzr"或".git")。即使您使用的是集中式存储库模型,单凭这一点就可以很好地在SVN上使用它们中的一个。(除此之外:事实上,我经常使用SVK作为我的SVN客户机,而仅仅是为了这个特性而使用SVN存储库(不过,仅在Linux上,SVK在Windows上并不好)。
当然,Subversion的一个优点是,如果只需要一个子文件夹,就不必签出整个项目。
Canonical(Ubuntu)跟踪软件包为自己使用的发行版,所以没有需要两个堆栈rely在线交易两项popularity计数问题。然而,有了为他人芒,这是唯一的Ubuntu用户跟踪和Canonical(Ubuntu)和recommends辨别bzr(样品偏压)。nonetheless…
1 2 3 4 5 6 | 2011 2011 2011 Package Aug 3 Sep 29 Dec 9 Change ------ ------ ------ ------ ------ git-core 3647 3402 3236 -11% bzr 4975 5286 6070 +22% mercurial 3411 3387 3461 +1% |
的下降在投票的Git芯包让我认为我做什么什么样的错误的错误
这里的一些历史数据的东西。在过去的
1 2 3 4 5 6 | June Aug Dec Growth Oct Growth 2010 2011 2011 2013 ---- ----- ---- ---- ------ ---- ------ git 94k 159k 171k 80% 165k -3.5% bzr 52k 121k 135k 160% 170k 26.0% hg 36k 68k 75k 110% 95k 26.7% |
discalaimer:bzr在线使用Ubuntu,直到2012年的时候,在团队工作
自从GitHub上Git的社交编码起源以来,Git似乎吸引了很多追随者。
Git有这么多用户的原因是Linux内核使用它,所以如果您想进行Linux开发,就使用Git。
因为有这么多人参与了Git,我建议使用Git,这仅仅是因为它拥有更大的用户群。事实上,上面显示的数字是这一点的明显标志。
至于难度,所有版本控制都很困难,特别是分布式版本控制。SVN和CVS乍看起来并不容易(至少对我来说)。这只是习惯于版本控制系统的必要学习曲线的一部分。
编辑:既然你添加了一个Subversion引用,我想我会解决它。我认为大多数人会使用SVN,因为它有各种各样漂亮的GUI接口。一般来说,人们不喜欢使用命令行,包括一些开发人员。Git在Windows上通常也不能很好地工作(或者至少不能无缝地工作)。由于许多人都在Windows上,这会扼杀潜在用户的数量。
此外,我认为SVN的概念更容易理解,因为SVN使用中央存储库而不是分布式系统。更容易理解的是,"这里是代码的大山,请在这里添加您的代码,"而"这里是一些代码,我的可能不同于他的,他的和她的,但如果您愿意,您可以添加一些东西。"
在我看来,SVN有一个更好的文档系统。Git的文档针对的是更高层次的知识(程序的知识,而不是程序员的智能),因此在您使用系统之后是有意义的,但是当第一次启动时,它看起来就像一堆Gobbeldy Gook。
总的来说,我认为SVN现在和将来都会更加流行,因为它的一般操作概念更容易理解,工具也更容易使用,而且它在Windows上有极好的支持。
不过,让我以最后两分钱结束,并说我更喜欢Git,因为我认为它比我使用的任何其他系统都强大得多。一旦你开始更好地理解程序,爬上学习曲线肯定会有回报。
检查下面的链接)在两个主题:
http:/ / / / 160 www.debian-administration.org民调
我不normally邮件但…………………
在这里我想出去,和其他一些bzr忘记bzr招领有极极弱一点。"坚持男女大档案信息在整个文件加载到存储器中。这个大的二进制文件创建的问题。
Git是一批更好,在那方面。AS的难度。在Windows中使用Git Bash从Git。大鸭厂为止,在不到一周(,包括实际的工作和与其他experimenting VCS)
埃里克·辛克的一篇关于他们的有趣的博客文章。