Git vs Team Foundation Server

Jac*_*cko 255 git tfs tfvc

我向我的开发团队介绍了Git,除了我,每个人都讨厌它.他们想用Team Foundation Server替换它.尽管我对TFS不是很熟悉,但我觉得这是一个倒退的巨大一步.有经验的人可以比较TFS上的分支支持和Git分支吗?另外,总的来说,TFS的优点和缺点是什么?使用Git几年后我会讨厌它吗?

eck*_*kes 259

我想,声明

除了我,每个人都讨厌它

进一步的讨论浪费:当你继续使用Git时,如果出现任何问题,他们会责怪.

除此之外,对我来说,Git比我最欣赏的集中式VCS有两个优势(Rob Sobers部分描述):

  • 整个仓库的自动备份:每当有人从中央仓库撤出时,他/她就会获得变更的完整历史记录.当一个回购丢失时:不要担心,拿走每个工作站上的一个回购.
  • 离线回购访问:当我在家里工作(或者在飞机或火车上),我可以看到这个项目,每一个签入的全部历史,不启动我的VPN连接工作,可工作就像我在工作中:签入,结帐,分支,任何东西.

但正如我所说:我认为你正在打一场失败的战斗:当每个人都讨厌Git时,不要使用Git.它可以帮助你更多地了解他们为什么讨厌Git而不是试图说服他们.

如果他们根本不想要它,因为这对他们来说是新的,并且不愿意学到新的东西:你确定你会与那些员工一起成功发展吗?

真的每个人都讨厌Git还是受到一些意见领袖的影响?找到领导者并问他们问题是什么.说服他们,你会说服团队的其他成员.

如果你无法说服领导者:忘记使用Git,那就拿TFS吧.会让你的生活更轻松.

  • 砰的一声,哎呀.每当出现问题时他们都会责怪我.不是自己没有学习它是如何工作的.对我来说,Git与我在版本控制系统中经历的一样接近完美. (21认同)
  • 另一方面,TFS包括缺陷/工作项跟踪,报告,......和其他功能.所以Git vs TFS对VCS的功能只是缺少TFS的观点. (15认同)
  • @Artefacto我知道,但随后所有提交标签都会更改,并且所有元数据(代码审查讨论等)都是孤立的或需要更新.尽管如此,TFS的一个月让我觉得它不是Git联盟中的版本控制系统.Git以一种必须经验丰富的方式让开发人员高效工作.作为便笺簿隐喻的分支是邪恶强大的. (7认同)
  • @Richard我认为这对TFS来说是一个缺点:一旦你进入,你就会全力以赴.它会让一切变得平庸并且不会给你一个选择.有很多,更好的工具可用于跟踪工作项目,报告和项目管理. (6认同)
  • @Dan看到rebase,filter-tree ...... (5认同)
  • TFS中的@AlexDresko"架子"似乎相当于git中的"stash".虽然它们对于小的变化很有用,但它们很难在3天以上的工作中工作,也不能用于连续的变更等. (5认同)
  • @cupcake:即使在第一页中,该文章也有很多错误(即使不考虑过去三年的变化).无论如何1.没有人认为TFS是每个人的正确答案.2.在下一个版本中,TFS包括Git:哪种方式会改变这个问题的上下文,从而使所有现有答案无效.(顺便说一句,这些天我用的都是:既不完美也不适合每个人.) (4认同)
  • 我发现这个答案中给出的两个原因(本地回购,自动备份)非常弱.一家强大的软件公司已经在支持他们的回购......而且今天的连接性,以及VPN如此紧张,生产力就没有障碍. (3认同)
  • 让人们对自己的错误负责.人们很少被追究责任,这就形成了安全网,使他们能够责怪他人自己的过错. (2认同)
  • “作为便笺簿隐喻的分支是邪恶的强大。” 天哪,你们中的一些人可能从未听说过 TFS 的“搁置”功能…… (2认同)
  • +只是答案的方法论.良好的心理评估! (2认同)

Rob*_*ers 99

两个系统之间的关键区别在于TFS是一个集中式版本控制系统,而Git是一个分布式版本控制系统.

使用TFS,存储库存储在中央服务器上,开发人员签出工作副本,该副本是特定时间点代码的快照.使用Git,开发人员将整个存储库克隆到他们的计算机,包括所有历史记录.

在服务器死机的情况下,在开发人员的计算机上拥有完整存储库的一个好处是冗余.另一个好处是你可以在不修改服务器的情况下在修订版之间来回移动工作副本,这在服务器关闭或无法访问时会很有帮助.

对我来说,真正的好处是,您可以更改集提交到本地存储库,而无需与服务器通信或对团队造成潜在的不稳定更改(即,破坏构建).

例如,如果我正在开发一个大功能,可能需要一个星期的时间来完全编码和测试它.我不想在周中签入不稳定的代码并打破构建,但是如果我接近本周结束并且我不小心将我的整个工作副本丢了,会发生什么?如果我一直没有承诺,我就有失去工作的风险.这不是有效的版本控制,TFS很容易受此影响.

使用DVCS,我可以不断地提交,而不必担心破坏构建,因为我在本地提交更改.在TFS和其他集中式系统中,没有本地登记的概念.

我甚至没有考虑过在DVCS中有多好的分支和合并,但你可以在SO或谷歌上找到大量的解释.我可以从经验告诉你,TFS中的分支和合并并不好.

如果组织中TFS的论点是它在Windows上比Git更好,我建议在Windows上运行良好的Mercurial - 它与Windows资源管理器(TortoiseHg)和Visual Studio(VisualHg)集成.

  • 如果您正在开发一个可能会中断团队的大功能,建议使用功能分支,然后准备合并到开发分支中. (13认同)
  • @MikeCheel这是一个很棒的评论.您还可以每天创建一个代码**搁置**并在最终签入您的功能时删除它们(但分支的想法是更好的方法) (9认同)
  • 如果你正在开发一个可能破坏其他东西的功能 - 你不能只在TFS中创建一个分支吗?当然 - 分支机构在中央服务器上 - 但这真的很重要吗?看起来你可以在两者中有效地做同样的事情 - 看起来更像是你正在使用哪个IDE以及版本控制系统与它的集成程度如何 - (7认同)
  • 如果您考虑使用Mercurial,Joel Spolsky有一个很好的教学网站来教育您的团队:http://hginit.com/ (5认同)
  • 值得一提的是,git完全可以模拟集中式系统,并且为所有用户提供主要的git服务器是很常见的,你只是不*那样做. (3认同)
  • 您如何避免在更改上工作一周,在本地提交,然后在您推送它们之前,您的开发人员盒子就死了的问题?人们谈论 DVCS 的优势在于,不仅您的存储库的一份副本可能会丢失,但与我们的企业 TFS 服务器相比,我更担心我的工作站可能会死掉并且无法恢复。 (2认同)

Cha*_*ers 86

人们需要放下枪,离开窗台,一会儿.事实证明,DVCS具有客观,具体和无可否认的优势,这将为团队的生产力带来巨大的变化.

这一切都归结为分支和合并.

在DVCS之前,指导原则是"向上帝祈祷,你不必进入分支和合并.如果你这样做,至少乞求他让它变得非常非常简单."

现在,使用DVCS,分支(和合并)得到了很大的改进,其指导原则是,"做到这一点.它会给你带来很多好处而不会给你带来任何问题."

对于任何团队来说,这都是一个巨大的生产力助推器.

问题是,为了让人们理解我刚刚说过的话并确信它是真的,他们必须首先投入一点学习曲线.他们不需要学习Git或任何其他DVCS本身......他们只需要了解Git如何进行分支和合并.阅读并重新阅读一些文章和博客文章,慢慢来,并通过它直到你看到它.这可能需要2或3整天的大部分时间.

但是一旦你看到了,你甚至不会考虑选择非DVCS.因为DVCS确实有明确,客观,具体的优势,最大的优势在于分支和合并.

  • 我知道.我和朋友正在抛弃这个类比 - 想象一下你需要一个严肃的关系数据库.您评估Sql Server,Oracle和MS Access.您最终会选择Access,因为它具有最好的GUI,尽管它无法扩展,不能很好地强制引用完整性等.分支和合并是版本控制系统的绝对之物.任何其他功能只是侧面的一点点.但人们正在根据金光闪闪的选择做出选择. (57认同)
  • 虽然我倾向于同意你的陈述,但我不明白为什么Git的分支和合并只是因为它是一个"分布式"系统而"更好".我不确定DVCS与其合并能力有什么关系.我想解释为什么在分布式系统中合并更容易.根据我的经验,主要是Git和Svn,在SVN中合并是可怕的,不是因为它是集中式VCS,而是因为它没有像GIT那样正确地跟踪分支机构的修订. (15认同)
  • @ rally25rs完全同意re:承诺是原子工作单位.大多数集中式系统不仅没有以这种方式组织数据,而且还阻碍了开发人员为了实现真正良好的分支和合并工作而必须进行的即时工作.分布式系统鼓励我称之为"apposite"提交(自包含,相关工作的小型提交和良好的描述)和集中式系统鼓励我称之为"差异炸弹",你在洞穴中钻孔,直到你准备好然后放弃几天(或数星期)对系统的工作.猜猜哪种合并最好? (10认同)
  • @ rally25rs - 我同意大部分内容.VCS也没有理由不擅长合并.还没有(我知道).但我不同意的部分是"纯粹通过编写更好的合并程序来更好地解决冲突".秘诀不在于更聪明的合并程序,而在于采用一种根本不同的方法来处理存储在回购中的信息以及如何组织它.主要是,提出内部国家的基础.提交不仅仅是一个很酷的插件......它们是功能的基础. (8认同)
  • 谢谢,查理.我知道,而且你知道,但是对于那些说"将源代码控制与Visual Studio集成是我最重要的功能"之类的人来说很难理解. (3认同)
  • @BenCollins三年后,迟到了派对 - 但赞成"差异炸弹"一词.那时大声笑了起来. (3认同)
  • @ rally25rs(续) - "如何"DVCS擅长合并?有几个原因,包括他们维护有关"提交"的信息,因此当你将A合并到B时,他们知道A中的"提交"已经在B中,哪些不是.如果A是一个很长的血统中的某个地方,那么B也是如此,那么知道你已经拥有哪些承诺以及哪些承诺不是很大.但这只是让DVCS更好地融合的一个因素,而且我已经没有空间了. (2认同)
  • @Charlie-我同意您的声明,尤其是关于跟踪提交的声明(这是SVN绝对糟糕的地方,IMO)。我唯一的观点是,仅仅因为某个VCS是集中式的,并不意味着它固有地在分支和合并方面就很糟糕。肯定有人可以写出比Git更擅长分支/合并的CVCS,这纯粹是通过编写更好的合并例程来更好地解决冲突。实际的分配与集中分配是无关紧要的。重要的是VCS如何跟踪更改和解决合并。再次,不争论您的陈述,仅争论语义。 (2认同)

Lee*_*som 44

原创:@Rob,TFS有一些所谓的" 货架 ",解决你关于commiting工作正在进行又不影响官方的构建问题.我意识到你看到中央版本控制是一个障碍,但就TFS而言,检查你的代码到架子上可以看作是一个强大的b/c然后中央服务器有一份正常工作的副本在罕见的事件中您的本地机器崩溃或丢失/被盗或您需要快速切换齿轮.我的观点是TFS应该在这方面得到适当的赞扬.此外,TFS2010中的分支和合并已经从以前的版本进行了改进,当您说"......从经验来看,TFS中的分支和合并不好"时,您所指的是什么版本并不清楚.免责声明:我是TFS2010的温和用户.

编辑Dec-5-2011:对OP来说,困扰我TFS的一件事是它坚持在你没有处理它们时将所有本地文件设置为"只读".如果你想进行更改,那么流程就是你必须"检出"文件,这只是清除文件上的readonly属性,以便TFS知道要密切关注它.这是一个不方便的工作流程.我希望它工作的方式是只是自动检测我是否进行了更改,并且根本不担心/烦恼文件属性.这样,我可以在Visual Studio或Notepad中修改文件,或者使用我喜欢的任何工具.在这方面,版本控制系统应尽可能透明.有一个Windows资源管理器扩展(TFS PowerTools)允许您在Windows资源管理器中使用您的文件,但这并不能简化工作流程.

  • FYI - 如果您使用的是当前默认的本地工作空间,则TFS"11"不再需要只读位.它可以智能地发现从任何应用程序更改的文件.Brian Harry在此处提供了有关改进的更多信息:http://blogs.msdn.com/b/bharry/archive/2011/08/02/version-control-model-enhancements-in-tfs-11.aspx (8认同)
  • 与像Git一样在分支中提交相反,搁置不容易理解和管理.你不知道在每次提交时都有搁架,你经常遇到合并问题(如果你从那以后做了修改,它们经常丢失).Git分支比搁置更强大,更容易理解.搁架适用于从未体验过其他东西的开发人员.... (6认同)
  • 这回答了问题,它不应该是评论,即使你有代表. (2认同)
  • @EdBlankenship,非常感谢你的博客链接.这是一个很好的消息,看到只读位废话正在被解决,以便更容易使用下一版本的TFS. (2认同)
  • 这种"检出"文件的工作流程让人联想到Visual SourceSafe,因为这是常见的工作方式; 文件从SourceSafe检索并作为只读文件存储在本地.检出文件或一堆文件可以被标记为独占,这意味着其他人可以看到另一个开发人员正在处理的文件集,以防止在禁用分支时合并的需要(可能是因为右猪在VSS). (2认同)

She*_*ock 18

除了所说的一切之外(

/sf/answers/309166651/

/sf/answers/342586961/

/sf/answers/309066411/

),这是正确的,TFS不仅仅是一个VCS.TFS提供的一个主要功能是本机集成的错误跟踪功能.变更集与问题相关联,可以跟踪.支持各种签入策略,以及与Windows域集成,这是运行TFS的人所拥有的.与Visual Studio紧密集成的GUI是另一个卖点,它吸引了不到一般的鼠标和点击开发人员及其经理.

因此,将Git与TFS进行比较并不是一个值得提出的问题.正确但不切实际的问题是将Git与TFS的VCS功能进行比较.那时,Git将TFS从水中吹走.但是,任何认真的团队都需要其他工具,这就是TFS提供一站式目的地的地方.

  • 请您在任何敏捷工具应用程序中获得TFS提供的相同工具.集会,你说出来. (4认同)
  • 虽然我同意 TFS 具有更广泛的目标这一事实,但我会将其重新表述为“它试图提供一站式目的地”,但在它尝试执行的任何任务中都不够好(至少不是最佳选择)解决; 所以它就像一把钝的瑞士刀。 (2认同)

byt*_*dev 17

如果您的团队使用TFS并且您想使用Git,您可能需要考虑使用"git to tfs"桥接器.基本上,您每天都在计算机上使用Git工作,然后当您想要推送更改时,将它们推送到TFS服务器.

那里有几个(在github上).我在最后一个地方(和另一个开发者一起)使用了一个并取得了一些成功.看到:

https://github.com/spraints/git-tfs

https://github.com/git-tfs/git-tfs

  • Microsoft现在提供与Git存储库和TFS的直接集成:http://blogs.msdn.com/b/bharry/archive/2012/08/13/announcing-git-integration-with-tfs.aspx (6认同)

小智 15

在经过一番调查之后,我参与的公司也决定去TFS.不是因为GIT不是一个好的版本控制系统,而是最重要的是TFS提供的完全集成的ALM解决方案.如果只有版本控制功能很重要,那么选择可能就是GIT.然而,对于常规开发人员来说,陡峭的GIT学习曲线可能不会被低估.

在我的博客文章中看到TFS作为真正的跨技术平台的详细解释.

  • 也许,但是TFS的每个部分都很糟糕且难以管理(事实上,你需要一个真正的TFS管理员).看Git> TFS(VCS),Jenkins> TFS(CI),nunit或xunit> mstest,IceScrum或...> TFS(项目管理).TFS在开始时是一个好主意,直​​到你使用它! (3认同)
  • 当然,有一个完全集成的ALM很高兴.但不是以牺牲灵活性为代价.IMO.ALM应该采用尽可能多的"同类最佳"技术构建......或者至少是整合最佳品种的灵活性,因为它们可能会随着时间的推移而发生变化.选择TFS基本上是在投入利润,称"微软将在我的ALM的所有方面取胜",这很愚蠢.例如,我使用Git w/Jira,它允许我根据提交消息更新/关闭问题.根据我的经验(很多TFS),这是一个非常优越的工作流程. (2认同)

jes*_*ing 14

整个Git的分布式东西真的很棒.它提供了一些功能搁置集没有(在当前产品),如本地回滚和提交选项(如Eclipse的localhistory功能).您可以使用开发人员分支来缓解这种情况,但说实话,许多开发人员不喜欢分支和合并一点.我一直在问到TFS几次过于频繁打开旧风格"的独家结账"功能(并否认每一次).

我认为许多大型企业都非常害怕允许开发人员将整个历史记录带入本地工作区并与之一起(例如新员工)......窃取快照很糟糕,但却带走了整个历史更加麻烦.(并不是说你无法从TFS获得完整的历史记录)...

它提到它是一种很好的备份方式,这对于开源来说非常有用,原来的维护者可能会停下来关心并删除他的版本,但是对于企业计划来说,这对许多企业而言都是不足的,因为没有明确的责任分配保持备份.如果主要的"项目"以某种方式消失,那么很难确定使用哪个版本.哪个会倾向于指定一个存储库作为前导/中心.

我最喜欢Git的是Push/Pull选项,您可以轻松地为项目贡献代码,而无需拥有提交权限.我猜你可以在TFS中使用非常有限的用户和搁置集来模仿这个,但它没有Git选项那么强大.跨团队项目的分支也可能有效,但从管理角度来看,对于许多组织来说这并不可行,因为添加团队项目会增加大量的管理开销.

我还想添加非源控件区域中提到的内容.工作项跟踪,报告和构建自动化(包括实验室管理)等功能从中央领先的存储库中受益匪浅.当您使用纯分布式模型时,这些变得更加困难,除非您将其中一个节点引导(因此返回到分布较少的模型).

随着TFS 11附带TFS 11,期望分布式TFS可能并不遥远,它允许您将本地TFS基本同步到TFS 12+时代的中央TFS.我会在uservoice中对此进行投票!

  • 整个答案很快就过时了.Microsoft已向Team Foundation Service添加了Git支持,并将对Git添加对Team Foundation Server的下一个主要版本的支持. (3认同)

Pad*_*ddy 9

对我来说,主要的区别是TFS将添加到您的解决方案(.vssscc)以"支持"TFS的所有辅助文件 - 我们最近有这些文件的问题最终映射到错误的分支,这导致一些有趣的调试...

  • 我已经忘了我曾经多么讨厌VSS如何为你修改你的文件. (5认同)
  • 这里好点.Git将添加`.git`文件夹来跟踪所有存储库详细信息.TFS将至少修改你的`.sln`(或者是`.csproj`?)文件,将远程存储库的位置放入其中. (2认同)