我发现Subversion再教育,Martin Fowler的这篇文章非常有用。
Mercurial和其他DVCS促进了使用变更集和本地提交的新代码处理方式。它防止合并地狱和其他协作问题。
我们不会受到此影响,因为我练习持续集成,除非在进行实验,否则不能在私有分支机构单独工作。我们为每个主要版本使用一个分支,其中修复了从主干合并的错误。
Mercurial允许您使用中尉
I理解这对于像Linux这样的大型项目很有用,但是我看不到小型且高度协作的团队(5至7人)的价值。
Mercurial更快,需要更少的磁盘空间和完整的本地副本可以实现更快的日志和差异操作。
我也不对此感到担心,因为即使在非常长时间的情况下,我也没有注意到SVN的速度或空间问题我正在从事的大型项目。
我正在寻找前SVN极客的个人经验和/或意见。特别是关于变更集的概念和整体性能的提升。
UPDATE(1月12日):我坚信值得尝试。
UPDATE(6月12日) :我亲吻了Mercurial,我喜欢了。他的樱桃本地风味的味道。我亲吻Mercurial只是为了尝试。我希望我的SVN服务器不要介意。感觉很不对劲。感觉很好。并不是说我今晚恋爱了。
最终更新(7月29日):我荣幸地复习了Eric Sink的下一本书,即“示例版本控制”。他说服了我。我去买水银。
#1 楼
注意:有关当前问题的答案,请参见“编辑”。首先,阅读Joel Spolsky的Subversion Re-education。我想您的大多数问题都会在那得到解答。另一个建议是Linus Torvalds在Git上的演讲:http://www.youtube.com/watch?v = 4XpnKHJAok8。另一个可能还会回答您的大多数问题,而且相当有趣。
顺便说一句,我发现这很有趣:甚至是Brian Fitzpatrick和Ben Collins-Sussman,他们的两个原始创造者subversion在一次Google演讲中表示“对此感到抱歉”,指的是subversion不如水银(和一般DVCS)。一项显着的好处是您可以脱机提交,因为这意味着以下几点:
您不依赖服务器和连接,这意味着速度更快。
成为可以进行Internet访问(或VPN)以进行提交的地方。
每个人都备份了所有内容(文件,历史记录),而不仅仅是服务器。意味着任何人都可以成为服务器。
如果需要,可以强制执行,而不会弄乱别人的代码。提交是本地的。提交时不要踩到对方的脚趾。您不会仅仅通过提交来破坏他人的构建或环境。
没有“提交访问”权限的人可以提交(因为在DVCS中提交并不意味着上传代码),降低了贡献的障碍,您可以决定拉动他们的更改
它可以加强自然沟通,因为DVCS使得这很重要...在颠覆中,您所拥有的提交竞赛反而会迫使沟通,但是会阻碍您的工作。
贡献者可以合作并处理自己的合并,这最终减少了集成商的工作。
贡献者可以拥有自己的分支机构,而不会影响他人的分支机构(但必要时可以共享)。
关于您的观点:
DVCSland中不存在合并地狱;不需要处理。请参阅下一点。
在DVCS中,每个人都代表一个“分支”,这意味着每当更改被提取时就会合并。命名分支是另一回事。
如果需要,您可以继续使用连续集成。恕我直言,这不是必需的,为什么要增加复杂性呢?只需将测试作为您的文化/政策的一部分。
在某些方面,Mercurial更快,而在其他方面,git更快。总的来说,这并不是真正意义上的DVCS,而是具体实现AFAIK。
每个人都将拥有完整的项目,而不仅仅是您自己。分布式事物与您可以在本地提交/更新,从计算机外部共享/获取有关,这称为推/拉。
再次阅读Subversion Re-Education。 DVCS更容易,更自然,但是它们有所不同,请不要以为cvs / svn ===所有版本的基础。
我为Joomla项目贡献了一些文档来帮助宣讲迁移到DVCS,在这里我制作了一些图表来说明集中式与分布式。
集中式
在一般实践中分布
分配到最完整的
在图中您仍然可以看到“集中式存储库”,并且这是集中版本控制爱好者最喜欢的论点之一:“您仍在集中”,不是,您不是,因为“集中”存储库只是大家都同意的存储库(例如,官方github仓库),但这可以改变现在,这是使用DVCS的开源项目(例如,具有大规模协作的项目)的典型工作流程:
Bitbucket.org有点像github上的mercurial,知道它们有无限的私有存储库,具有无限的空间,如果您的团队小于五个,则可以免费使用。
最好的方法说服自己使用DVCS正在尝试DVCS,每位使用svn / cvs的资深DVCS开发人员都会告诉您,这是值得的,并且他们不知道如果没有DVCS,他们将如何生存下来。
编辑:要回答您的第二次编辑,我只想重申一下,使用DVCS时您具有不同的工作流程,我建议您不要寻找因为最佳实践而不尝试的理由。当人们认为没有必要使用OOP时,因为他们可以使用XYZ范式来解决复杂的设计模式;您仍然可以从中受益。
尝试一下,您将看到在“私有分支”中进行工作实际上是一个更好的选择。我可以说出最后一个为什么成立的原因之一是因为您失去了承诺的恐惧,允许您在认为合适的任何时候都可以承诺并以更自然的方式工作。
关于“合并地狱”,您说“除非我们正在试验”,否则我说“即使您正在试验+维护+在修改后的v2.0中同时工作”。正如我之前所说的,合并地狱不存在,因为:
每次提交时都会生成一个未命名的分支,并且每次更改遇到其他人的更改时,都会自然合并。
因为DVCS为每次提交收集更多的元数据,所以在合并期间发生的冲突较少...因此您甚至可以将其称为“智能合并”。
当您遇到合并冲突时,这就是您可以使用:
而且,项目规模也无关紧要,当我从Subversion切换时,我实际上已经在单独工作时已经看到了好处,一切都感觉不错。变更集(不完全是修订版本,而是对包含提交的特定文件的一组特定更改,与代码库的状态隔离开来),您可以直观地看到对特定文件组所做的操作的含义,而不是整个代码库。
关于变更集如何工作以及性能如何提高。我将尝试举一个示例来说明它:从github网络图中显示的svn切换到mootools项目。
之前
之后
您所看到的是开发人员能够在提交时专注于自己的工作,而不必担心破坏他人的代码,他们会担心关于在推/拉之后破坏别人的代码(DVCS:先提交,然后推/拉,然后更新),但是由于合并在这里比较聪明,所以它们通常永远不会做...即使发生合并冲突(这种情况很少见),您只需花费5分钟或更短的时间修复它。
我对您的建议是寻找一个知道如何使用汞/ git的人,并告诉他/她亲自向您解释。通过与一些朋友在命令行上花费大约半小时,同时在我们的台式机和Bitbucket帐户上使用mercurial,向他们展示了如何合并,甚至为他们捏造了冲突,以了解如何在可笑的时间内解决问题,我得以展示
最后,如果您与Windows一起工作,我建议您使用mercurial + bitbucket而不是git + github。 Mercurial还是有点简单,但是git对于更复杂的存储库管理(例如git rebase)更强大。
一些其他推荐读物:
分布式修订控制系统:Git vs. Mercurial vs. SVN
Git vs. Mercurial:请放松
分布式版本控制和Git [第1部分]和分布式版本控制和Git [第2部分]
Git / Mercurial与Subversion:搏斗!
DVCS vs Subversion smackdown,第3轮
为什么我比Git更喜欢Mercurial(第1部分,第2部分)
为Git贡献力量:减少与Git VCS进行开源协作的摩擦
”到目前为止,DVCS为您工作了吗?” -在Joomla上发帖!在Joomla实验性采用了Merurial和git之后,Framework Development邮件列表要求反馈!平台项目
DVCS分支(带有Mercurial)-对DVCS中分支的外观进行了详细的面向示例的介绍,这可能是这些系统中最重要的功能
评论
很好的答案,但与OP在同一条船上,对我们这些人来说只是一个问题:您能解释一下合并地狱是如何不存在的吗?积分器或贡献者的叉子过时时,是否不需要执行相同的操作?
–妮可
2011年1月9日15:36
好答案。附带说明:尽管Spolsky可能有一些不错的观点,但请记住,他也试图使用这些要点作为销售材料来销售产品,这使它们有些偏颇。
–马丁·威克曼(Martin Wickman)
2011年1月9日在16:06
我阅读了该再教育页面,但由于许多原因,它并不相关。我将以我对此主题的个人观点来编辑我的问题。
–user2567
2011年1月9日在16:24
还值得指出的是,Git可以充当Subversion客户端,这意味着您无需一次将所有人都转换为Git;一些团队成员可以根据需要使用Git,这样他们的个人工作流程就会得到改善(特别是因为合并更加容易)。
– Greyfade
2011年1月9日在17:50
@ Pierre,DVCS负责合并来自各个程序员的软件更改,而不是实际使软件编译或通过现有的单元测试。每当源更改时,您仍然需要其他软件来执行此操作,而我们目前最好的选择是使用CI引擎(并正确执行)
–user1249
2011年1月9日在21:58
#2 楼
您要说的是,如果您基本上停留在单个分支上,则不需要分布式版本控制。是的,但这不是对您的不必要的强力限制一种工作方式,并且无法在多个时区的多个位置进行很好的扩展?中央Subversion服务器应位于何处,如果该服务器由于某种原因关闭,每个人都应该回家吗?
DVCS是Subversion的,Bittorrent是ftp
(从技术上讲,不是合法的)。也许如果您考虑了一下,您可能会理解为什么会有这么大的飞跃?
对我来说,我们切换到git会立即导致
我们的备份更容易执行(只需“ git remote update”就可以完成)
在不访问中央存储库的情况下更易于执行小的步骤。您只需工作,然后在回到托管中央存储库的网络时进行同步。
Fast Hudson构建。因此,使用git pull比更新要快得多。
因此,请考虑为什么bittorrent比ftp更好,然后重新考虑您的位置:)
注意:已经提到在某些情况下ftp比bittorrent更快。这与您喜欢的编辑器维护的备份文件比版本控制系统使用起来更快的方式相同。
评论
我几乎决定要在一个真实的项目中尝试一下。
–user2567
2011年1月9日19:06
好主意。记住要以“我真的很喜欢这个!”的思路去研究它。而不是“我不想这样做!”。有很多东西要学。如果您选择git,则github有很多不错的在线帮助。如果选择hg,乔尔(Joel)已编写了一些不错的在线材料。如果选择bzr,Canonical最有可能拥有很多不错的在线资料。其他?
–user1249
2011年1月9日19:19
嗯,假设您认为bittorrent比FTP更好...
–墨菲
2011年1月9日在21:33
@Murph,我也是,暴雪也是如此(我相信我们可以同意的人知道如何处理大规模在线同步吗?)。 wowwiki.com/Blizzard_Downloader
–user1249
2011年1月9日在21:54
@Murph,您在服务器上启动一个torrent服务器,并在客户端上启动一个torrent客户端。不难。它应该立即让您相信仅需要更改已更改的文件。另外,您是否考虑过用rsync代替ftp可以购买增量更新吗?
–user1249
2011年1月10日下午14:18
#3 楼
分布式版本控制系统的杀手级功能是分布式部分。您无需从存储库签出“工作副本”,而是克隆存储库的整个副本。这是巨大的,因为它提供了强大的好处:即使在没有Internet访问权限的情况下,您也可以享受版本控制的好处,例如...并夸大其词是DVCS出色的原因-它并不是一个强大的卖点,因为我们许多人发现自己无需Internet就能进行编码的频率开始下雨了。杀手is是,在将提交历史记录推送到主存储库之前,您完全可以控制提交历史记录。
每次都修复了一个错误,并最终得到如下结果:
r321 Fixed annoying bug.
r322 Argh, unexpected corner case to annoying bug in r321!
r323 Ok, really fixed corner case in r322
r324 Oops, forgot to remove some debugging code related to r321
...
等等。像这样的历史很混乱-确实只有一个修复程序,但是现在实现是在许多包含不想要的工件(例如添加和删除调试语句)的提交之间进行的。对于像SVN这样的系统,替代方案是直到一切正常后才提交(!!!),以保持历史记录的清洁。即便如此,当大量的工作没有受到版本控制的保护时,错误也会流失,墨菲定律正等待残酷地对待您。
拥有您自己的存储库的本地副本,可以在您修复此问题时进行修复可以通过连续滚动“ fix it”和“ oops”提交到“ bug fix”提交来重写历史记录。一天结束时,一个干净的提交将发送到主存储库,如下所示:
r321 Fixed annoying bug.
应采用的方式是这样。
与分支模型结合使用时,重写历史记录的功能更加强大。开发人员可以执行完全独立于分支机构的工作,然后当需要将该分支机构引入主干时,您会遇到各种有趣的选择:
做一个普通的香草合并。将所有东西都带进疣。
重新设定基准。允许您对分支历史进行排序,重新排列提交顺序,将提交扔掉,将提交联接在一起,重新编写提交消息-甚至是编辑提交或添加新的!分布式版本控制系统为代码检查提供了深层支持。
一旦我了解了本地存储库是如何允许我出于对程序员的同情和未来自我的考虑而编辑历史的,我就挂断了电话。 SVN很好。我的Subversion客户端现在为
git svn
。允许开发人员和管理人员对提交历史记录进行编辑控制,可以得到更好的项目历史记录,并且可以使用干净的历史记录确实提高了我作为程序员的工作效率。如果所有有关“重写历史记录”的讨论都吓到了您,请不要担心,因为这是中央,公共或主存储库的用途。历史可能(并且应该!)被重新编写,直到有人将其带入其他人正在从中获取的存储库的分支中。那时,历史应该被视为刻在石碑上。
评论
重写历史:这仅仅是Git的事情吗?还是在Mercurial中也容易吗? (如果是这样,我真的需要开始这样做。)
– Paul D. Waite
2011年1月10日上午10:08
在执行此操作时,应注意Linux Kernel准则-即,不要为您公开发布的分支建立基础(或重写历史记录)。如果您拥有可供短期使用的公共分支机构(用于合并到像linux-next这样经常被丢弃的分支机构,或者供某人查看然后丢弃其本地副本的分支机构),则可以重新设置这些分支机构-但您的其他用户应该清楚该分支的约定是可以重新设置基础,并且不应该合并到其他人的长期分支中。
–肯·布鲁姆
2011-1-10 14:38
您可能会在没有完全内部网络访问的情况下访问Internet。我旅行时经常发生这种情况。
–user1249
2011年1月11日在8:42
不需要互联网访问非常重要,因为这就是DVCS的速度之源。一旦必须通过网络发送数据包,无论连接的质量如何,都在将过程减慢一个数量级左右。
–亚当·拉塞克(Adam Lassek)
2011年1月26日23:33
@Paul,我的理解是在Mercurial中可以做到的,但这不是基本的功能或理念。
– Benjol
2011-3-7在12:46
#4 楼
dukofgamings的答案大概是可以得到的,但是我想从另一个方向解决这个问题。让我们假设您说的是绝对正确的,并且通过应用良好的实践,您可以避免DVCS旨在解决的问题。这是否意味着DVCS不会给您带来优势?人们发臭于遵循最佳实践。人们会搞砸了。那么,为什么您要避免使用旨在解决一系列问题的软件,而选择依靠人们去做一些您可以事先预测出他们不会做的事情呢?
评论
实际上,我会提出反对DCVS的论点。我公司最近从CVS转到Mercurial。在CVS上,人们在合并过程中更经常擦除其他人的更改。
– Juozas Kontvainis
2012年2月16日上午10:38
@JuozasKontvainis:我不太了解Mercurial,但是在git中,您可以禁止包含不包含HEAD作为父项的合并的推送,这可以防止用户从master推送没有最新更改的更改。我敢肯定,水银中也有类似的东西。
–naught101
2012年7月1日,下午3:48
@ naught101:实际上,我的公司已启用该设置。发生的事情是程序员在本地提交更改,然后尝试推送。他从服务器得到一个响应,他需要将其合并才能推送。他从服务器获取更新,并尝试进行合并提交。在这一点上,我不知道这些人是如何进行合并提交的,但是在某些情况下,合并提交基本上抹去了他们从服务器获得的更改。
– Juozas Kontvainis
2012年7月2日10:00
听起来好像人们撤消了更改,然后实际上在合并时从服务器删除了从服务器获得的更改(这是可能的)。当然,来自服务器的变更集仍然存在,因此您可以将存储库重置为变更之前的状态。
– Philosodad
2012年7月3日在17:02
实际上,听起来像是这样:randyfay.com/content/avoiding-git-disasters-gory-story一篇不错的,非关键性的文章,介绍了如果您不知道自己在做什么,可能会导致git repo出错。
– gbjbaanb
2012年10月9日在21:16
#5 楼
是的,当您必须在Subversion中合并大型提交时,这样做会很痛苦。但这也是一次很棒的学习经历,使您尽一切可能避免合并冲突。换句话说,您学会了经常签入。对于任何共处一地的项目,早期集成是一件非常好的事情。只要每个人都这样做,使用subversion就不会有太大问题。例如,Git是为分散工作而设计的,它鼓励人们从事自己的项目并创建自己的fork。 (稍后)合并。它并不是专门为OP所要求的“小型且高度协作的团队”中的持续集成而设计的。相反,想一想。如果您要做的只是坐在同一个房间里以相同的代码一起工作,那么您将无法使用其精美的分布式功能。对于一个共同使用CI的团队,我其实,不管您是否使用分布式系统,都没什么大不了的。归结为口味和经验。
评论
Git专为遍布全球的分布式工作而设计,并鼓励人们从事自己的项目并创建自己的分支。它不是专门为持续集成在“小型且高度协作的团队”中而设计的,这是OP所要求的。
–马丁·威克曼(Martin Wickman)
2011年1月9日在20:14
猜猜是什么,您会遇到更小/更容易解决的冲突。但是,如果两个ppl更改了代码的相同部分,则您的团队会遇到计划问题,而任何VCS都无法解决。是否分布。
–马丁·威克曼(Martin Wickman)
2011年1月9日在20:29
OP使用CI在同一个团队中。这意味着他们经常(一天几次)进行多次小型签到。鉴于此,我看不出使用dvc的原因应有的任何特殊优势,也看不出应发生任何大的合并并因此没有合并地狱的理由。我不建议在分布式团队中使用svn,但这不是这种情况。
–马丁·威克曼(Martin Wickman)
2011年1月9日在21:57
@MartinWickman-Mercurial旨在快速,廉价地进行提交,分支和合并。这听起来很适合持续集成。就我个人而言,我认为能够让Alice分支更改,并建议Bob将其拉出并将其更改合并到该分支上以检查问题-所有这些都无需接触中央服务器或将更改推到任何地方-听起来是一种不错的方法为小型且高度协作的团队工作。
– Philosodad
2011年1月10日上午8:47
我的$ 0.02。我现在已经将Subversion,Mercurial和Git用于各种项目。对于非常紧密集成的团队进行持续集成,Subversion似乎确实是最佳选择。 Mercurial更适合可能一天只完成一个构建而每次代码更改都更多的小组(这会在SVN中产生合并问题)。对于那些拥有可以连续数日/数周运行而无需实际将代码组合在一起进行构建的团队的人来说,Git似乎是一种方法。
–布赖恩·诺伯劳
2011年1月10日13:24
#6 楼
因为您应该不断挑战自己的知识。您喜欢颠覆,我可以理解,因为我使用了很多年,对此感到非常高兴,但这并不意味着它仍然是最适合您的工具。我相信,当我开始使用它时,它是当时的最佳选择。但是随着时间的推移会出现其他工具,现在我更喜欢git,即使对于我自己的业余时间项目也是如此。
Subversion确实有一些缺点。例如。如果您在光盘上重命名目录,则不会在存储库中重命名该目录。不支持文件移动,这使文件移动时执行复制/删除操作,使得在移动/重命名文件时难以合并更改。合并跟踪并不是真正内置于系统中,而是以变通办法的形式实现。
Git确实解决了这些问题(包括自动检测文件是否已移动,您甚至不需要告诉它是事实)。
另一方面hand git不允许您像subversion一样在单个目录级别上分支。
所以我的答案是,您应该研究替代方案,看看它是否比您所熟悉的更适合您的需求,然后决定。
评论
的确,试验替代品应该是自动的。
–user2567
2011-1-22在11:53
git使用某种启发式方法来确定文件是否已移动,这是好的,但不是完美的。
– gbjbaanb
11年4月22日在0:15
同意这一点,即使您讨厌该死的孩子使用的新工具,我认为重要的是要迫使自己至少尝试新事物,尤其是在这些事物引起巨大轰动的情况下。
– Tjaart
2012年7月4日在16:09
#7 楼
在性能方面,当您必须从一个分支切换到另一个分支,或从一个修订版本跳到另一个修订版本时,Git或任何其他DVCS都比SVN具有更大的优势。由于所有内容都存储在本地,因此比SVN的处理要快得多。仅此一项就可以让我切换!
评论
同意,git checkout非常快。
–user1249
2011年1月9日在20:51
+1指出这一点,在分支/变更集之间跳转非常快
–dukeofgaming
2011年1月9日在21:25
#8 楼
而是坚持“通过应用最佳实践,您不需要DVCS”的想法,为什么不考虑SVN工作流程是一个工作流程,却具有一组最佳实践,而GIT / Hg工作流程则是另一个工作流程,具有一组不同的最佳实践。git bisect
(及其对您的主存储库的所有影响)在Git中,一个非常重要的原则是:可以使用
git bisect
查找错误。为此,请使用已知运行的最后一个版本,以及已知运行失败的第一个版本,然后(在Git的帮助下)执行二进制搜索以找出导致该错误的提交。为此,您的整个修订历史记录必须相对没有其他会干扰您的错误搜索的错误(信不信由你,这实际上在实践中效果很好,Linux内核开发人员一直在这样做)。 /> 要实现
git bisect
功能,您可以在其自己的功能分支上开发一个新功能,对其进行重新设置基础并清除历史记录(因此,历史记录中没有任何已知的无法正常使用的修订版-只是一堆的更改,每项更改都会帮助您解决问题),然后在完成功能后,将其合并到具有工作历史记录的主分支中。此外,要使此工作生效,规管从哪个版本的主分支开始您的功能分支。您不能仅仅从
master
分支的当前状态开始,因为那可能有不相关的错误-因此内核社区中的建议是从最新的稳定版本的内核(针对大型功能)开始工作,或者开始最新的带标记的发行候选作品。您还可以同时将功能分支推送到服务器来备份中间进度,也可以将功能分支推送到服务器与他人共享并在功能完成之前征求反馈,然后再进行操作。将代码转换为项目中每个人*必须处理的代码库的永久功能。
gitworkflows手册页很好地介绍了Git设计的工作流程。也是为什么Git比X更好?讨论了git工作流。
大型分布式项目
为什么我们需要一支具有良好实践和良好经验的高度协作的团队中尉设计习惯?
由于在Linux之类的项目中,涉及的人员如此之多,地理位置如此分散,以至于很难像共享会议室的小型团队那样高度协作。 (我怀疑对于开发像Microsoft Windows这样的大型产品,即使人们都位于同一栋大楼中,团队规模也太大了,无法保持协作水平,而这种协作水平使集中化的VCS无需使用副手即可工作。)
评论
我不明白你的第一点。你有参考吗?关于最后一个,我将项目分为多个单独的组件。我从来没有做过这么大的项目,在同一个项目中得到的开发人员最多只有两个。
–user2567
2011年1月9日在17:50
@皮埃尔将项目划分为单独的组件当然是合理的。由于Linux是单片内核,因此(本质上)这意味着所有设备驱动程序都必须在同一存储库中开发,即使每个驱动程序本质上都是一个单独的项目。同时,他们希望敏捷的经验丰富的架构师能够进行涉及所有这些驱动程序的广泛更改,因此将它们分解到不同的存储库中将是一件痛苦的事情。因此,git(和中尉)非常适合他们处理这些不同的问题。
–肯·布鲁姆
2011年1月9日在17:55
您可能也有兴趣阅读Martin Fowler关于SVN与Git和Mercurial工作流程的比较。 martinfowler.com/bliki/VersionControlTools.html
–肯·布鲁姆
2011年1月9日17:56
我会定期在SVN上进行两部分介绍,以查找错误。与Git的唯一区别是,它不是全部都是自动的。但这仅不足以使我们转换。
– Xavier Nodet
2011年1月9日在20:18
git bisect对小型团队的相关性几乎为零。我将其用于内核,一次将来自不同人员的数百个变更合并在一起,然后将其破坏。但是,如果您有5个团队,通常可以快速查看一下,消除2-3个潜在的问题补丁。日志。
– blucz
2011年1月26日在18:19
#9 楼
为什么不串联使用它们?在我当前的项目中,我们被迫使用CVS。但是,我们还保留本地git存储库以进行功能开发。这是两全其美的imo,因为您可以尝试各种解决方案并在自己的计算机上保留正在处理的版本。这使您可以回滚到功能的先前版本,或尝试几种方法而不会在弄乱代码时引起问题。拥有中央存储库将为您带来拥有集中存储库的好处。评论
但是,您仅可以使用DVCS来建立中央存储库(并且可以像使用CVCS一样紧密地控制权限。那么这样做有什么好处?
–naught101
2012年7月1日,凌晨3:04
是的,但是如果您在Windows环境中,则可能难以设置中央git存储库。我想那几乎是我唯一能想到的。我们被迫在公司级别使用CVS,因此我们没有太多选择。
–Vadim
2012年7月5日在18:45
#10 楼
我没有DVCS的个人经验,但是根据我在这里的答案和一些链接的文档中得出的结论,DVCS和CVCS之间最根本的区别是使用的工作模型。您正在做隔离开发。您正在与其他所有更改隔离地开发新功能/错误修正,直到决定将其发布给团队的其他成员为止。在此之前,您可以进行任何所需的签入,因为没有其他人会对此感到烦恼。CVCS
CVCS(特别是Subversion)的工作模型是您正在协作发展。您正在与所有其他团队成员直接合作开发新功能/错误修正,所有更改都将立即提供给所有人。
其他差异
svn
和git
/ hg
之间的其他差异,例如修订版与变更集是偶然的。很有可能基于修订版本创建DVCS(如Subversion拥有它们)或基于变更集创建CVCS(如Git / Mercurial拥有它们)。我不推荐任何特定工具,因为它主要是取决于您(和您的团队)最适应的工作模型。
个人而言,使用CVCS不会遇到任何问题。
我不担心检查任何东西,
当我遇到合并地狱时,它处于
svn
和git
/ hg
都可能发生的情况。例如,当我们开发V3时,某些软件的V2由不同的团队使用不同的VCS维护。有时,必须将错误修正从V2 VCS导入到V3 VCS,这基本上意味着要在V3 VCS上进行非常大的签入(所有错误修正都在一个变更集中)。我知道这并不理想,但这是使用不同VCS系统的管理决定。评论
我认为隔离开发实际上不是DVCS的工作模型。 DVCS的一项重要功能是团队的其他成员可以拉本地更改或克隆本地存储库。您可以根据自己的喜好进行提交,所做的更改始终可用,并且错误不会导致大规模破坏。
– Philosodad
2011年1月10日15:55
@philosodad:如果其他人在不知道代码状态的情况下从我的存储库中提取代码,它仍然可能造成破坏。唯一的区别在于责任是谁。而且我的代码并不总是可用。这仍然取决于我的系统是否配置为外部访问。
–巴特·范·恩根·舍瑙(Bart van Ingen Schenau)
2011年1月11日上午10:59
如果人们从您的存储库中提取代码并将其与自己的代码合并,那么他们可以独立地回滚,而不会出现大量问题。其次,可以肯定的是,如果您决定拒绝访问代码库并削弱系统的主要功能,则可以对自己进行隔离。这与为隔离开发建模的系统有很大不同。 DVCS不是。您对DVCS工作模型的理解是完全错误的。
– Philosodad
2011年1月11日在17:39
@philosodad:我想我开始越来越了解它:每个人都可以像在CVCS中一样弄乱自己,但不再是你的错,因为您没有将其推向他们。 :-)
–巴特·范·恩根·舍瑙(Bart van Ingen Schenau)
2011年1月12日15:07
好吧...但是通常情况下,爱丽丝会先克隆或分支,然后合并您的更改,这使假装她从未看到过您的错误代码变得更加容易!
– Philosodad
2011年1月12日15:37
评论
我对此也很感兴趣。 Subversion符合我被教导思考版本控制的方式(来自CVS等)。但是,尽管我不得不使用Mercurial和Git尝试对开源项目进行一些错误修复,但我尚未转换。+1问题。如今,与集中式配送相比,配送变得更简单,更快捷,更简单,更自然,更无故障,并且变得轻快了90%,已成为一种货运狂热。除了不一定是这样。它们是不同的工具,每种工具在某些情况下可能具有优势,而在其他情况下则可能具有劣势。
@Sharpie:已经使用svn,git和hg多年了,我非常了解它们的优缺点。尽管git当然是其中最强大的,但重要的是要认识到,更强大的功能并不能自动暗示更好。 Emacs当然比运行在Web浏览器中的任何javascript文本编辑器都强大,但是,奇怪的是,我现在正在将此注释写到javascript浏览器文本编辑器中!在许多情况下,简单甚至愚蠢都有其价值。在本地使用集中式svn和类似git-svn之类的东西提供了两全其美的方法。
@Sharpie:喜欢它对您有好处。但是一个人的优点就是另一个人的缺点。有些人认为具有单个规范主干的单个集中式存储库的清晰度非常有价值。这是一个有关Google如何将其2000年以上所有项目的源代码保存在一个包含数亿条代码行的单一代码干中的演示,超过5000名开发人员访问同一存储库。您想在每个人的办公桌上使用5000台服务器和2000个项目的历史吗?-)
-1供Katy Perry参考。 ;)