Git vs Team Foundation Server [关闭]


262

我向开发团队介绍了Git,除我之外,每个人都讨厌它。他们希望将其替换为Team Foundation Server。尽管我对TFS不太熟悉,但我觉得这是一个巨大的退步。有经验的人可以将TFS的分支支持与Git分支进行比较吗?另外,总体而言,TFS的优缺点是什么?使用Git几年后我会讨厌它吗?


24
您将在这一方面面临艰巨的挑战。Git在Windows上还不如svn / hg / tfs成熟,它不会给git老手带来太多麻烦,但对于新手来说却是一个头疼的大问题。
马塞洛·坎托斯

7
@Jacko:过去几周我一直在评估git-for-Windows。自从我大约一年前上次查看以来,它已经有了显着的改进,但要与典型的Windows开发人员进行黄金时间的准备还有很长的路要走。例如,VS插件坦白地令人担忧。它不过是主菜单栏下的一堆菜单选项,如果选择解决方案而不是项目,这些菜单选项将自动失败。我无法使用提交工具来索引大块和行,这是我使用git的主要原因,而到git gui(这是从可用性POV出发的完全错误)充其量是很尴尬的。
Marcelo Cantos 2010年

6
不过,我会对你诚实。丢下git令我丧命。与目前流行的观点相反,两者是同等的,我发现git的模型更加强大和合乎逻辑。Mercurial没有匹配git索引的内容,我讨厌它的分支方法。Git的标签概念,您可以在仓库之间移动并同步,这非常优雅。Mercurial的书签是唯一接近的东西,它们是为每个人设置的PITA。但最重要的是,考虑到工具的人员和相对成熟度,使用svn→Mercurial比svn→git更可能获得成功。
马塞洛·坎托斯

4
是的,Git掌管力量和优雅。但是,并非所有人都为此做好了准备。
Jacko 2010年

7
@JamesReategui:我个人认为(stackoverflow.com/a/11362998/520162)将VCS集成到IDE中是很麻烦的。想象一下,如果明天要切换主IDE。如果放弃VS for Eclipse怎么办?您真的愿意学习新的VCS集成吗?Git在命令行上很棒(stackoverflow.com/a/5645910/520162)。学习它,您将发现一个功能强大的版本控制世界。
eckes 2012年

Answers:


272

我认为,声明

每个人都讨厌它,除了我

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

除此之外,对于我来说,Git与我最欣赏的集中式VCS相比有两个优点(如Rob Sobers所描述的那样):

  • 整个存储库的自动备份:每当有人从中央存储库中提取信息时,他/她都会获得更改的完整历史记录。当一个仓库丢失时:不要担心,请在每个工作站上使用其中之一。
  • 离线回购访问:当我在家里工作(或者在飞机或火车上),我可以看到这个项目,每一个签入的全部历史,不启动工作我的VPN连接,并能正常工作像我在工作中:签到,签出,分支等任何内容。

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

如果他们只是不想要它,因为这对他们来说是新事物,并且不愿意学习新知识:您确定要与该员工一起成功发展吗?

真的每个人都讨厌Git还是受到某些意见领袖的影响?找到领导者,然后问他们有什么问题。说服他们,您将说服团队的其他成员。

如果您不能说服领导者:忘记使用Git,请使用TFS。将使您的生活更轻松。


22
快点,脖子。每当发生问题时,他们都怪我。不是他们自己没有学习它是如何工作的。对我来说,Git就像我在版本控制系统中所经历的一样接近完美。
Jacko 2010年

15
另一方面,TFS包括缺陷/工作项目跟踪,报告等功能。因此,仅在VCS功能上的Git与TFS完全缺少TFS的要点。
理查德

5
@Dan看到重新建立基础,过滤树...
Artefacto

7
我知道@Artefacto,但是随后所有的提交标签都会更改,并且所有元数据(代码审查讨论等)都将被孤立或需要更新。但是,使用TFS的一个月使我相信,作为版本控制系统,它不在Git的联盟中。Git使开发人员能够以必须经历的方式被理解才能释放出生产力。作为便笺本隐喻的分支是邪恶强大的。
丹·索洛维

6
@Richard我认为这是TFS的缺点:一旦您进入,便全都投入了。它做的一切都很平庸,并且没有让您选择。跟踪工作项,报告和项目管理的工具远非如此。
Ben Collins'5

102

这两个系统之间的主要区别在于TFS是集中式版本控制系统,而Git是分布式版本控制系统。

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

在开发人员的计算机上拥有完整存储库的好处之一是可以在服务器死机时实现冗余。另一个不错的好处是,您可以在修订版本之间来回移动工作副本,而无需与服务器对话,这在服务器关闭或无法访问时很有用。

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

例如,如果我正在开发一项重大功能,则可能需要一周的时间来进行编码和完整测试。我不想在周中检入不稳定的代码并破坏构建,但是如果我快要在周末结束并且不小心弄乱了整个工作副本,会发生什么情况?如果我一直都没有做出承诺,那我就有失去工作的风险。这不是有效的版本控制,因此TFS容易受到此影响。

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

我什至没有研究DVCS中更好的分支和合并方式,但是您可以在SO上或通过Google找到很多解释。我可以从经验中告诉您,在TFS中进行分支和合并是不好的。

如果组织中关于TFS的观点是它在Windows上比Git更好,那么我建议使用Mercurial,它在Windows上效果很好-与Windows资源管理器(TortoiseHg)和Visual Studio(VisualHg)集成在一起。


5
如果您确实考虑与Mercurial一起使用,Joel Spolsky拥有一个出色的教程网站来教育您的团队:hginit.com
Martin Owen 2010年

3
这可能是值得一提的是Git是完全capabable模拟一个集中式系统,并且它的共同拥有对所有用户的主服务器的Git,你只是不具备做这种方式。
蒂姆·阿贝尔

7
如果您正在开发可能会破坏其他功能的功能-是否不能仅在TFS中创建分支?当然-分支位于中央服务器上-但这真的重要吗?似乎您可以在两个方面都有效地做同样的事情-似乎更多地是关于您使用的是哪个IDE以及版本控制系统与它的集成程度如何的问题
William

13
如果您正在开发可能会干扰团队的重大功能,建议使用功能分支,然后在准备就绪时合并到开发分支中。
Mike Cheel 2014年

9
@MikeCheel这是一个很棒的评论。您也可以每天创建代码的货架,并在最终签入功能时将其删除(但是分支的想法是一种更好的实现方式)
RPDeshaies 2014年

86

人们需要放下枪,远离窗台,然后思考一分钟。事实证明,DVCS具有客观,具体和不可否认的优势,这将极大地提高团队的生产力。

全部归结为分支和合并。

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

现在,通过DVCS,分支(并合并)得到了很大的改善,指导原则是:“轻而易举地做到这一点。它将为您带来很多好处,而不会给您带来任何问题。”

对于任何团队来说,这都是巨大的生产力提升。

问题是,要使人们理解我刚才说的话并确信这是事实,他们必须首先投资一点学习曲线。他们不必学习Git或任何其他DVCS本身……他们只需要学习Git如何进行分支和合并即可。阅读并重新阅读一些文章和博客文章,然后慢慢阅读,直到发现为止。这可能需要2到3天的大部分时间。

但是,一旦看到这一点,您甚至都不会考虑选择非DVCS。因为DVCS确实具有明显,客观,具体的优势,所以最大的成功在于分支和合并领域。


3
谢谢,查理。我知道,而且您也知道,但是很难说出这样的话:“将源代码控制与Visual Studio集成对我来说是最重要的功能”
Jacko

58
我知道。我和一个朋友正在抛出这种类比-假设您需要一个认真的关系数据库。您评估Sql Server,Oracle和MS Access。您最终选择Access是因为它具有最好的GUI,尽管它无法扩展,不能很好地执行参照完整性,等等。分支和合并是版本控制系统的绝对要素。任何其他功能都只是在侧面闪闪发光。但是人们正在根据金光闪闪做出选择。
查理·弗罗德

17
尽管我倾向于同意您的说法,但我不明白为什么Git的分支和合并“更好”,而仅仅是因为它是“分布式”系统。我不确定作为DVCS与其合并能力有关。我想解释一下为什么在分布式系统中合并更容易。以我的经验(主要是Git和Svn)而言,在SVN中进行合并并不是很糟糕,这不是因为它是集中式VCS,而是因为它不能像GIT那样正确地跟踪跨分支的修订。
CodingWithSpike 2011年

8
@ rally25rs-我大部分都同意。没有理由VCS也不能擅长合并。(据我所知)还没有。但是我不同意的部分是“纯粹是通过编写更好的合并例程来更好地解决冲突”。秘诀不是更好的合并例程,而是采取根本不同的方法来处理存储在存储库中的信息以及如何组织它。主要是使提交内部状态的基础。提交不仅是很酷的事情,而且是功能的基础。
查理·

10
@ rally25rs完全同意re:承诺是工作的原子单位。大多数集中式系统不仅没有以这种方式组织数据,而且还阻止了开发人员为了完成真正的分支合并工作而必须立即进行的工作。分布式系统鼓励我所谓的“适当的”提交(独立的,少量的,具有良好描述的相关工作的提交),而集中式系统则鼓励我所谓的“ diff炸弹”,即在洞穴中躲藏直到准备好然后放下几天(或数周)值得在系统上进行的工作。猜猜哪种融合最好?
本·科林斯

45

原文:@ Rob,TFS有一个称为“ 货架 ”的东西 ”,解决你关于commiting工作正在进行又不影响官方的构建问题。我意识到您认为中央版本控制是一个障碍,但是就TFS而言,将您的代码检查入架可以看作是强项,那么在极少数情况下,中央服务器会复制您的在制品您的本地计算机崩溃或丢失/被盗,或者您需要快速切换齿轮。我的观点是,在这方面应该给TFS适当的赞美。另外,TFS2010中的分支和合并已从以前的版本中得到了改进,当您说“ ...根据经验,TFS中的分支和合并不好时”,您所指的是哪个版本尚不清楚。免责声明:我是TFS2010的中度用户。

编辑Dec-5-2011:对于OP,令我烦恼的是TFS,它坚持要在不使用本地文件时将所有本地文件设置为“只读”。如果要进行更改,流程是必须“检出”该文件,该操作仅清除文件上的readonly属性,以便TFS知道要注意它。这是一个不方便的工作流程。我希望它起作用的方式是,它会自动检测我是否进行了更改,并且完全不用担心文件属性。这样,我可以在Visual Studio或记事本中,或使用我喜欢的任何工具来修改文件。在这方面,版本控制系统应尽可能透明。有一个Windows资源管理器扩展(TFS PowerTools),这样您就可以在Windows资源管理器中处理文件,但是并不能大大简化工作流程。


2
这回答了问题,即使您有代表,也不应发表评论。
SingleNegationElimination's

8
仅供参考-如果您正在使用本地工作空间,那么TFS“ 11”不再需要只读位。它可以智能地发现从任何应用程序更改了哪些文件。布赖恩·哈利在这里有关于改进的一些详细信息: blogs.msdn.com/b/bharry/archive/2011/08/02/...
埃德布兰肯希普

2
@EdBlankenship,非常感谢您的博客链接。看到只读位废话已得到解决,以使使用下一版本的TFS更加容易,这真是一个好消息。
Lee Grissom 2012年

7
与像使用Git一样在分支中提交内容相反,货架不容易理解和管理。您不知道在每次提交时都执行了搁架,并且合并经常遇到问题(如果从那时起进行了修改,则它们常常会丢失)。Git分支比搁置功能强大和易于理解。货架是developpers是从未经历过别的东西....
菲利普

2
这种“签出”文件的工作流程让人想起Visual SourceSafe,因为这是常见的工作方式。从SourceSafe中检索文件并将其作为只读文件存储在本地。签出一个文件或一堆文件可能被标记为互斥,这意味着其他人可以看到另一个开发人员正在处理的文件集,以防止禁用分支时合并的需要(可能是由于VSS中的右猪)。
Brett Rigby 2014年

18

最重要的是(

https://stackoverflow.com/a/4416666/172109

https://stackoverflow.com/a/4894099/172109

https://stackoverflow.com/a/4415234/172109

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

因此,将Git与TFS进行比较并不是一个适当的问题。正确(尽管不切实际)的问题是将Git与TFS的VCS功能进行比较。那时,Git将TFS吹出了水面。但是,任何认真的团队都需要其他工具,这是TFS提供一站式服务的地方。


4
请获得TFS在任何敏捷工具应用程序中提供的相同工具。集会,你叫它。
PositiveGuy13年

2
虽然我同意TFS具有更广泛的目标这一事实,但我还是将其改写为“提供一站式目的地的TRIES”,但在它尝试完成的任何任务中都不够好(至少没有最好的选择)解决; 所以就像一把钝的瑞士刀。
slashCoder 2015年

@PositiveGuy,如果没有工作和配置,您将无法获得它。TFS只需单击即可为您提供整个过程。举例来说,整个生态系统现在都可以作为云服务使用,并且需要零配置。如果我可以获得版本控制,Scrum支持,自动化构建,测试实验室和测试计划管理,并且可以将它们与公司LDAP(lie AzureAD)集成在一起,则价格为10美元/月,为什么我会按我的想法去做试图自己粘贴碎片?
Craig Brunetti

1
@slashCoder如何将全套套件视为每件作品中最好的?非最佳方式的成本真的超过了必须自行管理组件集成的成本吗?...也许在某些地方,我可以看到。但是运行这些东西纯属开销。如果您的公司GIT运行正常,但是JIRA实例出现故障,并且Jenkins升级没有成功,会发生什么?对?就像杂耍的电锯。着火。半蒙住眼睛。:) :)
Craig Brunetti

17

如果您的团队使用TFS,而您想使用Git,则可能需要考虑“从git到tfs”的桥梁。本质上,您每天在计算机上使用Git进行工作,然后当您要推送更改时将其推送到TFS服务器。

有一对夫妇(在github上)。我在最后一个地方(以及另一个开发人员)使用了一个,但取得了一些成功。看到:

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

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


6
微软提供了Git仓库和TFS直接集成现在: blogs.msdn.com/b/bharry/archive/2012/08/13/...
埃德布兰肯希普

1
@EdBlankenship,您可能希望将评论转换为答案。对于OP来说,这似乎是一个很好的解决方案。我会投票。:)
Lee Grissom 2012年

1
除非您使用Windows以外的其他平台,否则应首选git-tfs!git-tf远不及git-tfs好...而且哲学是面向TFS的,而git-tfs更面向git的(这就是我们想要的!)
Philippe

15

在利弊之间进行了一些调查之后,我所参与的公司也决定选择TFS。不是因为GIT并不是一个好的版本控制系统,而是最重要的是对于TFS提供的完全集成的ALM解决方案。如果仅版本控制功能很重要,则选择可能是GIT。但是,对于普通开发人员而言,陡峭的GIT学习曲线可能不会被低估。

请参阅我的博客文章TFS中作为一个真正的跨技术平台的详细说明。


3
也许可以,但是TFS的每个部分都很糟糕并且难以管理(实际上,您需要TFS的真正管理员)。依次查看Git> TFS(VCS),Jenkins> TFS(CI),nunit或xunit> mstest,IceScrum或...> TFS(项目管理)。刚开始使用TFS是一个好主意,直​​到您使用它!!!
菲利普

1
为什么需要TFS,只需获得一个出色的敏捷应用程序即可。然后使用Git或Subversion,您就可以使用了。TFS会让您陷入困境,从而妨碍您前进。
PositiveGuy

更新:TFS 2013(服务器)[和VS12-13)现在支持git进行版本控制。因此,您可以两全其美
DarcyThomas 2013年

2
当然,拥有完全集成的ALM很好。但不以牺牲灵活性为代价。海事组织。应该使用尽可能多的“最佳品种”技术来构建ALM……或者至少要灵活地集成最佳品种,因为它们可能会随着时间而变化。选择TFS基本上是在打赌,说“微软将在我的ALM的各个方面取胜”,这很愚蠢。例如,我使用了带有Jira的Git,这使我可以根据提交消息来更新/关闭问题。以我的经验(也有大量的TFS),这是一个非常出色的工作流程。
Scott Silvi 2014年

1
边栏-即使具有TFS / Git集成,您基本上是在说“让VCS移植到Git,同时保持我们的问题跟踪”-基本上与使用带有任何其他问题跟踪软件的Git没什么不同。因此,鉴于Microsoft尝试灵活性(我鼓掌),因此我不确定ALM参数是否有效。
Scott Silvi

14

Git的整个Distributed东西真的很棒。它提供了Shelvesets在当前产品中没有的一些功能,例如本地回滚和提交选项(例如Eclipse的localhistory功能))。您可以使用开发人员分支来缓解这种情况,但是老实说,许多开发人员不喜欢分支和合并。我被要求过几次频繁地在TFS中打开旧式的“独占结帐”功能(并且每次都拒绝该功能)。

我认为许多大型企业非常害怕允许开发人员将整个历史记录带入本地工作区并随身携带(例如,交给新雇主)...偷快照是不好的,但是要删除整个历史记录更加麻烦。(并不是说您无法从TFS获得想要的完整历史记录)...

提到这是一种很好的备份方式,这又对开源非常有用,因为原始维护者可能会停止关心并删除其版本,但是对于企业计划,由于没有明确的职责分工,这对于许多企业来说还是不够的保留备份。如果主要的“项目”以某种方式消失,将很难确定要使用哪个版本。倾向于任命一个存储库为领导/中央存储库。

我最喜欢Git的是Push / Pull选项,在这里您可以轻松地向项目贡献代码,而无需拥有提交权限。我想您可以在TFS中使用非常有限的用户和架子集来模仿这一点,但是它不如Git选项强大。跨团队项目进行分支也可能会起作用,但是从管理角度来看,对于许多组织来说,这实际上是不可行的,因为添加团队项目会增加很多管理上的开销。

我还要添加非源代码控制区域中提到的内容。中央领先的存储库极大地受益于工作项跟踪,报告和构建自动化(包括实验室管理)等功能。当您使用纯分布式模型时,这些操作将变得更加困难,除非您使节点之一处于领先地位(从而返回到分布较少的模型)。

随TFS 11一起提供的TFS Basic可能并不遥不可及,期望有一个分布式TFS,它使您可以在TFS 12+时代将本地TFS Basic同步到中央TFS。我将在Uservoice中对此投下赞成票


您还将对Microsoft提供给您的这一新功能感兴趣:gittf.codeplex.com
jessehouwing,2012年

1
使用git-tfs。目前,它比git-tf更好!!!github.com/git-tfs/git-tfs
Philippe

3
整个答案很快就过时了。Microsoft已向Team Foundation Service添加了Git支持,并将在Team Foundation Server的下一个主要版本中添加对Git的支持。
jessehouwing

1
@Philippe:我都尝试过。有几个区别:1)git-tf是跨平台的,而git-tfs仅在Windows上运行。2)git-tfs在“推送”以包含变更集编号时重写提交描述,而git-tf则保留本地提交哈希值不变。
Joey Adams

@JoeyAdams 1)+1,这是选择git-tf的唯一好理由2)您也可以使用git-tfs使用checkin命令(而不是rcheckin)来做到这一点。但是我更喜欢rcheckin,因为它是做事的git方法,这就是为什么我们选择使用git;)
Philippe

9

对我而言,主要区别在于TFS将添加到解决方案(.vssscc)中的所有辅助文件以“支持” TFS-我们最近遇到了这些文件最终映射到错误分支的问题,这导致了一些有趣的调试...


2
好点在这里。Git将添加该.git文件夹以跟踪所有存储库详细信息。TFS至少会修改您的文件.sln(或者它是.csproj?),以将远程存储库的位置放入其中。
CodingWithSpike 2011年

5
我忘了曾经讨厌VSS如何为您“修改”文件。
Paddy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.