我过去的两家公司都使用Git进行版本控制。据我所知,大约有90%的公司在其他版本控制系统上使用Git。没有中央资料库/真相来源。这是Linus Torvalds拥护的功能。

但是,似乎每个公司都以集中方式使用Git,就像一个公司会使用SVN或CVS。服务器上(通常在GitHub上)始终有一个中央存储库,人们可以从该存储库中提取并推送到该存储库。我从未见过或听说过(以我有限的经验)人们以真正去中心化的方式使用Git,即按自己认为合适的方式推和拉到其他同事的存储库。

我问题是:


为什么人们在实践中不使用分布式工作流程?
以分布式方式工作的能力对现代版本控制是否重要?听起来不错吗?

编辑

我意识到我原来的问题并没有理解正确的语气。听起来好像我在问,当分布式版本控制系统(DVCS)如此优越时,为什么有人会以集中方式工作。实际上,我的意思是,我认为DVCS完全没有好处。但是我经常听到人们鼓吹它的优越性,而现实世界似乎同意我的观点。

评论

我有完全一样的感觉,不明白这一点。

就个人而言,我只是不知道多个遥控器的用例,除了为主遥控器创建PR的分叉以外。分布式的东西仍然有用,因为这意味着我可以在计算机上获得完整的历史记录而不必与网络交谈,并且如果我真的愿意的话,我可以脱机完成一些工作,并且从一个在线回购主机迁移到另一个站点要容易得多。另一个。当您提到“分布式工作流”时,您到底想什么呢?

我相当确定Torvalds从一开始就打算拥有一个“真相源” Linux Kernel存储库。

最终,软件本身是集中的。客户不购买分支机构或远程站点,而是购买最终的,组装在一起的内置产品。始终需要有一些重要的前进道路。

对我来说,git的“分散性”是推荐它的最不重要的功能之一。 git在我的工作流中真正发挥作用的地方是能够在本地进行频繁的提交和回滚而又不影响其他人,或者强大的技术(例如重新定级)是git真正发挥作用的地方。有可能(实际上可能)通过分散实现所有这些,但是DVCS中的“ D”本身对我而言并不那么重要。

#1 楼

啊,但是实际上您是在分散使用git的!颠覆只有一种“回购”,一种真理的来源。当您进行提交时,它是到一个其他开发人员也要提交的中央集中回购。

这种工作有效,但是却导致了许多问题,最大的问题是可怕的合并冲突。事实证明,这些解决方案从烦人到噩梦到处都是。由于有一个事实来源,他们有一个令人讨厌的习惯,那就是使每个人的工作陷入停顿,直到他们解决。 git当然存在合并冲突,但它们不是停止工作的事件,而且更容易解决,而且速度更快。它们通常只影响涉及冲突更改的开发人员,而不影响每个人。

然后会出现整个单点故障以及随之而来的问题。如果您的中央svn存储库以某种方式失效,那么您将全被搞砸,直到可以从备份中还原它为止;如果没有备份,那么您全都被搞砸了。但是,如果“中央” git存储库丢失,则可以从备份,甚至从CI服务器,开发人员的工作站等上的存储库的其他副本之一恢复。您可以这样做是因为它们是分布式的,并且每个开发人员都拥有该仓库的一流副本。本地仓库。如果要与他人共享或作为真理的主要来源,则必须通过推向遥控器来明确地做到这一点。然后,其他开发人员可以在方便的时候撤消那些更改,而不必不断检查svn来查看是否有人做了将其破坏的事情。

您不必通过其他远程仓库将更改直接推给其他开发人员,而不必直接推给其他开发人员,这一事实无关紧要。从我们的角度来看,重要的部分是您本地的回购副本本身就是一个回购。在svn中,真理的主要来源是通过系统的设计来实现的。在git中,系统甚至没有这个概念。如果有真相的来源,则由外部决定。

评论


SVN合并也只会影响涉及冲突更改的开发人员。一次提交会将其提交到存储库中,在解决冲突之前,任何冲突的合并都不能进入该存储库(您也可以并行提交到单独的分支/路径,但是现在实际上并没有冲突吗?)

– Ben Voigt
16-4-10的1:36

我发现,当存在中央服务器时,主要区别在于GIT允许在网络中断时进行正在进行的本地版本控制,而SVN则不允许(某些其他版本控制系统更糟,当网络无法访问时停止所有工作,因为在签出之前,他们不允许您更改文件)。

– Ben Voigt
16-4-10在1:37



@BenVoigt哦,这一切正常。请记住,您必须先与仓库保持最新状态,然后才能签入。当其他人在尝试解决合并冲突的同时继续签入时,并给您另一套合并冲突...您要么停止否则您将失去理智所剩的一切。

–迈克尔·汉普顿
16-4-10在1:47



不,人们肯定可以继续提交您要合并更改的分支,而不会中断您的工作流程。

– Ben Voigt
16-4-10在1:49



本是对的。正确管理SVN存储库,并由经过适当的软件开发知识培训的团队使用,它实际上不应在主干上出现合并冲突。只有在某人做错了一些事情并且需要被解雇时,您才能获得它们(:P)。 inb4无需您教育人们如何使用他们的工具,就更加容易。是的,关于git的知识比关于SVN的知识还多!

–轨道轻赛
16-4-10在18:14



#2 楼

当构建服务器(您正在使用CI,对吗?)创建构建时,它从何处提取?当然,您可以争论的集成构建不需要“一个真正的仓库”,但是肯定是分发构建(即您提供给客户的东西)。

:零碎。如果您指定一个存储库为“该”存储库并任命负责审查请求的监护人,则您可以轻松地满足“给我一个软件版本”或“我是团队的新手,代码在哪里?”的要求。

DVCS的优势并不在于它的点对点,而在于它是分层的。我修改我的工作区,然后提交到本地。功能完成后,我将合并提交并将其推送到远程。这样,在我创建拉取请求并将项目管理员将其合并到One True存储库中之前,任何人都可以看到我的暂定代码,提供反馈等。 。对于某些工作流程(我将两种VCS类型用于不同的项目)很好,但是对于公共项目或OSS项目,它的面目全非。关键是DVCS包含多个步骤,这些步骤需要更多工作,但是提供了一种更好的方法,可以通过内置过程集成陌生人的代码,从而可以更好地查看正在检查的内容。以集中方式使用意味着您仍然拥有项目当前状态的黄金标准,同时还提供了更好的代码共享机制。

评论


总体而言,这是一个很好的答案,但是我可以肯定,在进行持续集成之前,Git已被广泛使用;顺便说一下,我们的团队确实使用CI,感谢您检查:D。

– Gardenhead
16年4月9日在22:18

@gardenhead:您错过了要点:如果集成是手动构建的,则使用相同的参数。 “ CI”只是一个比Git更旧的过程的自动化。

–布朗博士
16年4月9日在23:48

“任何人都可以看到我的暂定代码”-他们还可以提取您的暂定代码,将其与暂定代码合并,然后运行测试。在集中式VCS中,这很麻烦,因为它需要在一个真实副本中进行分支和更改。分布式,您只需配置额外的遥控器,然后开始合并,修补和挑选。您可以跟踪自己的工作,但是除非您选择发布它们,否则没有其他人可以看到您要做什么。总的来说,我建议在真正将SVN用于大型项目之前,不要宣布DVCS没有意义。

–史蒂夫·杰索普(Steve Jessop)
16-4-10在0:40



因为Linux内核没有“真正的构建”。由于每个人都可以自己构建它,因此Linus的回购协议不比其他任何人都规范。如果您销售的产品效果不佳。

–Miles Budnek
16年4月10日在6:25

@Superbest:很多(如果不是全部)git的设计都基于Bitkeeper。 Git是在linux-bitkeeper争议爆发后创建的。

–whatsisname
16-4-10的6:42

#3 楼

我不知道您如何定义“每个人”,但我的团队拥有“服务器上的中央存储库”,而且我们有时会不通过该中央存储库而从其他同事的存储库中提取信息。当我们这样做时,我们仍然会通过服务器,因为我们选择不通过电子邮件发送有关该地点的补丁,而不是通过中央存储库。通常,当一个小组正在就某个特定功能进行协作并希望彼此保持最新状态时,通常会发生这种情况。自然,由于我们不是秘密仓库工作人员,因此这种情况不会持续很长时间,但是DVCS可以灵活地执行最方便的事情。我们可以根据喜好发布功能分支,也可以不发布。

但是,肯定有90%以上的时间我们通过中央存储库。当我不关心任何特定更改或特定同事的工作时,它更方便且扩展性更好,它可以提取“已在中央仓库中审核的所有同事的更改”,而不是分别从N同事。 DVCS并非试图阻止“从主存储库中拉出”是最常见的工作流程,而是试图阻止它成为唯一可用的工作流程。就git软件而言,但就开发人员和我们的工作流程而言,它们并没有同等重要。当我们发布给客户或生产服务器时,我们用来做的回购与只有一个开发人员在其笔记本电脑上使用的回购具有不同的意义。如果“真正去中心化”的意思是“没有特殊的回购协议”,那么我认为那不是Linus拥护的意思,因为事实上,他确实保留了特殊的回购协议,这在大事情上比我昨天制作了一些Linux的随机克隆,计划仅用于开发一些小补丁,然后在他接受补丁后将其删除。 git并未将其回购权授予我的特权,但Linus对其授予了特权。他的“是Linux的当前状态”,不是。因此,变化自然会贯穿Linus。 DVCS相对于集中式VCS的优势并不是要有一个事实上的中心,而是因为不必(因为冲突允许)任何人都可以合并任何东西,所以更改不必经过任何中心。

由于DVCS系统是分散式的,因此它们也被迫提供某些方便的功能,其依据是您必须在本地必须具有完整的历史记录(即回购)才能执行任何操作。但是,如果考虑到这一点,没有根本原因无法配置带有本地缓存​​的集中式VCS,该缓存不会使只读操作的全部历史记录过时(我认为Perforce可以选择此模式,但我从未使用过Perforce)。或者原则上,您可以在远程安装的文件系统上用git目录配置.git/,以模拟没有网络连接时SVN不能正常工作的“功能”。实际上,DVCS使管道的功能比在集中式VCS中无法摆脱的更加强大。这是一个(非常受欢迎的)副作用,并有助于激励DVCS设计,但是这种在技术层面上的责任分配与完全分散所有人的责任并不相同。

评论


他们在技术上是等效的,而不是社会等效的。

–•uriousdannii
16年4月11日在4:23

通过电子邮件发送补丁相当轻松,以防万一有人考虑使用它,只需使用git format-patch然后使用git send-email。当我不想摆弄Github的访问控制并且很简单的时候,所有人都收到了电子邮件。

–旧帐户
16年4月11日在18:06

“必须在本地拥有完整的历史才能做任何事情” -并非如此;现代DSCM支持部分存储库(bzr术语为“ shallow checkouts”,git术语为“ shallow clones”)。

–查尔斯·达菲(Charles Duffy)
16-4-13在2:28



#4 楼

关于DVCS的本质,有趣的是,如果其他人以分布式方式使用它,除非他们直接与您进行交互,否则您可能不会知道它。您唯一可以说的就是您和您的直接队友不使用git。这不需要公司范围内的政策。因此,我想问你,为什么不以分散的方式使用git?

要解决您的编辑问题,也许您需要一些实际的集中版本控制经验才能体会其中的差异,它们看起来微妙,无处不在。这些是我的团队在集中化VCS时实际上无法完成的所有工作:每个微服务的仓库。其他所有人都可以用分叉的方式工作并通过请求请求进行提交。
可以更频繁地进行提交,通常每小时执行几次,而不是每天一次或两次。 ,然后每天将其推入并拉出几次,然后准备与较大的组共享时将其压扁。您是否知道要获得许可才能在传统的CVCS中为类似的内容创建临时分支有多难?

冒着听起来有些陈旧的风险,您真的不知道你有多容易。

评论


在传统的CVCS中创建分支有多难的问题完全取决于政策:我碰巧使用上游SVN存储库(自然是通过git-svn克隆!),并且我有权创建任何分支想要,即使这是一个很大的项目。只允许我在不首先与我的上级交谈的情况下接触多个指定的集成分支,更不用说中继了。其他公司可能还有其他可能更具限制性的政策,但当然不必如此。

–cmaster-恢复莫妮卡
16-4-10的7:06

您是对的,我不知道我有多容易。我希望我在SVN统治时期一直在身边,以欣赏我们的发展。作为一个非常年轻的软件开发人员,我发现这种模式经常重复出现:更有经验的开发人员告诉我,做某事的旧方法不好,而这种新方法/技术要容易得多。但是我只需要听他们的话就可以了。我永远无法真正欣赏到这些优势。我一直发现这种不和谐很难克服。

– Gardenhead
16-4-10的16:31

@gardenhead,您可以随时创建自己的SVN存储库并尝试破坏它;)(并注意它比创建git存储库并克隆它要困难得多...)-我注意到的另一个主要功能(至少在尤其是在公司环境中),文件共享要么有点笨拙,要么以占用存储库的方式来完成(例如,因为病毒扫描程序锁定在网络驱动器上)。

–Wayne Werner
16年4月11日,0:51

@gardenhead:好吧,让您自己感到幸运的是,您并没有被遗留在旧项目中,老软件开发人员告诉您旧的做事方法就很好了……有时候您会忍不住觉得它们只是很高兴他们不需要学习任何新技术!

–leftaround关于
16-4-11在15:25



@gardenhead显然正在疯狂地发布项目。如果您想找到一份出色的工作,则必须具备继续学习的能力。

–Wayne Werner
16年4月12日在12:45

#5 楼

最终,您正在构建产品。该产品在单个时间点上代表您的代码。鉴于此,您的代码必须在某个地方合并。自然点是从中构建产品的ci服务器或中央服务器,并且有意义的是,该中央点是git存储库。

#6 楼

我认为您的问题来自于(可理解的)始终保持联系的心态。即中央“真实” ci服务器始终(或几乎始终)可用。尽管在大多数环境中都是如此,但我至少已经在一个远非如此的环境中工作过。所有代码(我们正在谈论的代码价值超过10亿美元)必须(根据法律/国际协议,如果您不穿深色西装的人会来)在与任何Internet连接物理隔离的计算机上。这意味着通常情况下,我们每个人都有2台PC,一台用于编写/运行/测试代码,另一台用于Google东西,检查电子邮件等。在这些机器的团队中有一个本地网络,显然没有以任何方式连接到Internet。煤渣地下无窗房间(钢筋建筑,亚达亚达)。那台机器也没有互联网连接。而且,您可以想象。


在非常大的系统中,您有很多团队。他们通常将各自拥有自己的“中央”存储库,然后再返回到实际的(“神”层)“中央”中央存储库。我知道至少有1个承包商也用他们的代码执行了相同的硬盘git repo dash。

此外,如果您考虑使用Linux内核规模的东西...开发人员不会只是向Linus自己发送拉动请求。它本质上是仓库的层次结构-每个仓库都是/对某人/某些团队来说是“中心”。 (例如SVN)无法使用-或无法如此轻松地使用。

评论


我是Mile High(软件)俱乐部的成员-我已经在35,000英尺的高度提交了代码。当然,飞机现在有Wifi,但并非总是如此。很高兴知道,至少如果我们崩溃了,我的团队很可能会完整保留我的代码。

–Wayne Werner
16年4月11日,0:56

@WayneWerner是的。我一直在考虑提供一些无法(始终)连接的通用情况。例如。在飞机上,海上航行,空间站,非洲偏远地区等。

–恐龙
16年4月11日在3:50

#7 楼

DVCS的分布式方面始终以分叉的形式出现在开源开发中。例如,我贡献的某些项目被原始作者遗弃,现在有很多分支,维护人员有时会相互拉扯特定的功能。即使在一般情况下,OSS项目也通过拉取请求获得外部贡献,而不是通过让随机的人员推动访问地面真相回购来进行贡献。具有特定的正式版本,但在F / OSS世界中,这是规范,并非例外。

评论


从历史的角度来看,这也是正确的答案。 Linux内核已有很长时间了(开发人员称为“树”,例如“ Linus的树”或“ Andrew的树”),具有多个源存储库。 Linux在开发git时需要某种东西来支持这种分布式开发。

–sleske
16-4-10的7:30

@Luaan考虑了一段时间之后,我意识到你是对的。我更改了措辞-这样可以更好地体现区别吗?

–蓬松
16年4月11日在23:34

@fluffy对我来说听起来不错;)

–罗安
16年4月12日在8:04

#8 楼


为什么每个人都集中使用git?


我们从没见过面,大家怎么说呢? ;)

其次,您可以在Git中找到其他更多功能,但在CVS或SVN中找不到。也许只是您以为这必须是每个人的唯一功能。

确保许多人都可以像CVS或SVN这样集中使用它。但是请不要忘记,分布式VCS本身具有另一个功能:所有副本或多或少都是“完整的”(所有分支和完整的历史记录都可用),并且可以在不连接服务器的情况下检出所有分支。 />
我认为这是另一个不应该忘记的功能。

所以我能够提交我的更改,也许将正在进行的工作一起提交,然后将我的工作提取并重新建立到主要的开发分支上。 >
Git附带的其他功能:樱桃采摘
将历史一分为二
存储本地分支和存储更改(在Wikipedia中称为“搁置”)

也在Wikipedia中查看这三个表-版本比较续rol软件:


功能
基本命令
高级命令

所以再次,也许分散的方式并不仅限于此让人们使用它。



为什么人们在实践中不使用分布式工作流程?




任何在Bitbucked,GitHub等上贡献或托管更大项目的人都将准确地做到这一点。维护者保留“主”存储库,贡献者克隆,提交然后发送拉取请求。

在公司中,即使有小型项目或团队,如果他们要么外包模块,也不希望外部人员在不事先审查其更改的情况下修改其神圣的开发分支,则可以选择分布式工作流。



以分布式方式工作的功能对于现代版本控制来说是否很重要,... ...




和往常一样:它取决于要求。

如果需要适用任何点,请使用分散式VCS:


要脱机提交或浏览历史记录(即在假期中完成山间小屋的子模块的制作) )
提供中央存储库,但希望保留“真实的”存储库以查看更改(例如,针对大型项目或分布式团队)
偶尔提供(副本)整个历史记录和分支,同时防止直接访问中央存储库(类似于第二个存储库)
想要版本化某些东西,而不必远程存储或设置专用存储库理论(尤其是对于Git来说,仅需git init .就足以准备对某些版本进行版本化)

还有更多,但四个就足够了。 。还是听起来不错?


当然听起来不错-对于初学者。

评论


SVN在某个时候没有获得svn init吗?

–user253751
16年4月12日在4:11

#9 楼

灵活性既是祸也是福。而且由于Git非常灵活,因此对于典型情况几乎总是太灵活了。具体来说,大多数Git项目不是Linux。

因此,明智的选择是在实现Git时消除一些理论上的灵活性。从理论上讲,存储库可以形成任何图,实际上,通常的选择是一棵树。使用图论,我们可以看到明显的好处:在存储库树中,任何两个存储库恰好共享一个祖先。在随机图中,祖先的想法甚至不存在!

但是您的git客户端几乎可以肯定默认为“单个祖先”模型。节点具有单个祖先(根节点除外)的图恰好是树。因此,您的git客户端本身默认为树模型,因此默认为集中存储库。

评论


我同意,对于大多数用例,需要降低Git的灵活性。在我的上一份工作中,我们没有有关如何使用git的指南,因此存在不断的冲突和破坏。在我的新公司中,我们使用Git Flow模型,它使开发过程更加简化和轻松。

– Gardenhead
16年4月11日在14:53

允许非树不是“理论上的灵活性”。将自己限制为“仅树”,您将永远无法合并更改,从而使整个VCS变得毫无意义。

–通配符
16年4月11日在15:44

@Wildcard:合并树完全没有问题,为什么会这样呢?当然,您不能在随机节点之间合并,而只能在父/子节点之间合并。

– MSalters
16年4月12日在7:00

显然,我还不够清楚。我指的是提交树,而不是文件系统树。根据定义,合并提交具有多个父项,因此历史记录不再是树,而是DAG。

–通配符
16年4月12日在19:02

@Wildcard:MSalters表示存储库通常以树连接,而不是提交连接。他说的是,回购协议通常只有一个“上游”远程对象,他们会将其推送(或发出拉取请求)。我没有关于这是否正确的任何统计信息,但这与合并提交有多少父母完全无关。

–史蒂夫·杰索普(Steve Jessop)
16-4-14在11:04



#10 楼

业务逻辑奖励中央服务器。对于几乎所有现实的业务场景,集中式服务器都是工作流的基本功能。

因为您具有执行DVCS的能力并不意味着您的主要工作流程就必须是DVCS。当我在工作中使用git时,我们会以集中方式使用它,除了那些奇怪的奇怪情况,其中分散的位对于保持事物的前进是必不可少的。通常,您想使事情保持顺畅和轻松。但是,通过使用git可以确保您可以访问分布式端,以处理将来可能出现的恶劣情况。

#11 楼

对于同事来说,要从我的计算机上的git repo中拉出,意味着我需要在根级运行git守护程序作为后台任务。我对在我自己的计算机上或在公司提供的笔记本电脑上运行的守护程序非常谨慎。最简单的解决方案是“否”!对于同事来说,从我的计算机上的git repo中提取信息也意味着我的互联网地址需要固定。我旅行,我在家工作,偶尔我在办公室工作。如果我在办公室,甚至不需要VPN。我的同事可以轻松地从该分支中​​撤出。

另一方面,我的本地git repo是功能齐全的存储库。我可以提交新工作,为实验工作创建新的分支,并在弄乱事物时恢复工作,即使当我正在空地中间30000英尺的飞机上工作时。尝试使用集中式版本控制系统来做到这一点。

评论


“我非常讨厌在自己的计算机或公司提供的笔记本电脑上运行的守护程序。” -因为除了别的以外,在笔记本电脑上运行服务意味着当我合上盖子时该服务不可用! DynDNS可能会在多个位置提供帮助(在某种程度上,您仍然会被困在NAT之后),但是它对关闭网卡电源没有帮助...

–史蒂夫·杰索普(Steve Jessop)
16-4-14在11:10



有很多方法可以使git repo可见,而无需运行任何特殊的守护程序。它几乎可以通过任何文件共享(smb,sshfs等)进行访问,甚至还可以作为普通的HTTP存储使用。

–蓬松
16年4月14日在19:51

#12 楼

复杂度:

使用中央存储库,典型的工作流程可能是

1)。

如果相反,每个开发人员都拥有自己的master分支,对于开发人员0:

branch off from the central master branch
change the code
test
possibly go back to changing the code
commit
merge any new changes from the central master branch
test
possibly go back to changing the code
merge changes into the central master branch and push


点对点方法是O(N)。

一致性:

现在考虑Alice的master分支和Bob的master分支之间是否存在合并冲突。 N个开发人员中的每个开发人员都可以以不同的方式解决冲突。结果:混乱。有一些方法可以实现最终的一致性,但是在此之前,所有的开发人员时间都可能被浪费。

评论


如果您要投反对票,请问您对此有何评论?

–西奥多·诺维(Theodore Norvell)
16年4月14日在16:02

并不是说我介意那票。我只想知道答案是否有误。

–西奥多·诺维(Theodore Norvell)
16-4-14在20:03



#13 楼

很简单:

公司是具有集中式工作流程的集中式组织。 CTO是技术真理的最终来源。无论工具公司使用什么工具,都必须反映此命令链。公司就像军队一样-您不能让私人人士胜过将军。 GIT。分散的部分只是他们不需要的功能-因此他们忽略了它。结果取决于谁在说话。 Linus Torvalds并不完全是您的小卧室老鼠,这就是为什么GIT的不同功能对他而言比对以github为中心的公司更重要的原因。

#14 楼

也许是因为他的工资单处理是集中的,所以如果我们希望获得薪水,就必须让核心人员满意。

也许是因为我们正在创建一个产品,所以我们需要一个主副本

也许是因为程序员去一个地方获取每个人的更改要容易得多,而不必连接许多不同的机器。
/>
也许是因为bug数据库是集中式的,必须与代码保持同步。

集中式很棒,直到出现问题为止。...

Git是一个分布式系统,可以从任何最新的存储库中以低成本创建一个新中心(只需将存储库暴露给网络)。 Git还允许从开发人员机器上的存储库更新过时的备份,从而使恢复中心变得更加容易。

能够在存储库的本地副本上合并等。网络中断很大,但是不需要分布式系统;它只需要一个保留所有数据的本地副本的系统。就像通过飞行等方式签入代码一样。

最终,分发的成本很少,并且有一些好处。如果要对分支机构等进行很好的跟踪,则分发的大部分成本都在所需的区域中。如果要设计一个可在大多数公司中使用的系统,则不会将其设计为分发,而是集中控制源代码显然是主要的“用例”。