卖给我分布式版本控制

rin*_*rer 21 svn cvs dvcs centralized

我知道有数千个相似的话题浮出水面.我在这里读了至少5个线程但是为什么我仍然不相信DVCS?

我只有以下问题(注意我只是自私地担心Java项目)

  • 在当地投入的优势或价值是什么?什么?真?所有现代IDE都可以让您跟踪您的更改?如果需要,您可以恢复特定的更改.此外,它们还具有在IDE级别标记您的更改/版本的功能!?
  • 如果我的硬盘坏了怎么办?我的本地存储库在哪里?(那么与登记中央仓库相比,它有何凉爽?)
  • 离线工作或在飞机上工作.有什么大不了的?为了让我用我的更改构建一个版本,我必须最终连接到中央存储库.直到那时我如何在本地跟踪我的更改并不重要.
  • Ok Linus Torvalds将自己的生命献给了Git并且讨厌其他一切.这是否足以盲目地赞美赞美?与我的中型项目中的离岸开发商相比,Linus生活在一个不同的世界?

推我!

Tho*_*mas 14

我一直在你现在的位置,对分布式版本控制的使用持怀疑态度.我已阅读所有文章并了解理论论点,但我并不相信.

直到有一天,我输入git init并突然发现自己在git存储库中.

我建议你这样做 - 只需尝试一下.从一个小的业余爱好项目开始,只是为了掌握它.然后决定是否值得使用更大的东西.


Ale*_*ski 13

可靠性

如果您的硬盘默默地开始破坏数据,那么您真的很想知道它.Git采用你提交的所有内容的SHA1哈希值.你有一个带SVN的中央仓库,如果它的位被一个故障的硬盘控制器静默修改,你就不会知道它,直到为时已晚.

而且由于你有1个中央回购,你只需要吹掉你唯一的生命线.

使用git,每个人都有一个相同的repo,包含更改历史记录,并且由于SHA1的完整图像,其内容可以完全受信任.因此,如果你备份你的HEAD的20字节SHA1,你可以确定当你从一些不受信任的镜像克隆时,你会丢失完全相同的repo!

分支(和命名空间污染)

当您使用集中式仓库时,所有分支都可供全世界查看.你不能建立私人分支机构.您必须创建一些尚未与其他全局名称冲突的分支.

" test123- 该死,已经有了 test123.让我们试试吧test124."

每个人都必须用愚蠢的名字来看待所有这些分支.你必须屈服于公司政策,这可能与"不要做分支,除非你真的需要"一致,这会阻止你用git获得很多自由.

与提交相同.当你提交,你最好是真的确定你的代码工作.否则你打破了构建.没有中间提交.因为他们都去了中央回购.

有了git你就没有这些废话了.在本地分支和提交所有你想要的.当你准备好将你的变化暴露给世界其他地方时,你要求他们从你那里撤走,或者你把它推到一些"主要"的git仓库.

性能

由于您的仓库是本地仓库,因此所有VCS操作都很快,不需要往返行程并从中央服务器转移!git log不必通过网络查找更改历史记录.SVN呢.与所有其他命令相同,因为所有重要的东西都存储在一个位置!

观看Linus关于SVN的这些和其他好处的讨论.

  • 请注意,在现代版本的SVN LOG命令中,结果将被缓存,因此该命令不一定需要通过网络查找更改历史记录. (3认同)

Mar*_*ler 10

我是一名Mercurial开发人员,曾担任Mercurial顾问.所以我发现你的问题非常有趣,希望我回答它们:

  • 在当地投入的优势或价值是什么?[...]

你是正确的,IDE可以跟踪当前的变化,而不仅仅是简单的撤销/重做.但是,这些文件快照和完整版本控制系统之间的功能仍然存在差距.

在您提交审核之前,本地提交可让您在本地准备"故事".我经常处理涉及2-5次提交的一些更改.在我提交4之后,我可能会稍微修改提交2(也许我在提交4之后在提交2中看到了错误).这样我就不仅会处理最新的代码,而且会处理最后几次提交.当一切都是本地的时候,这很简单,但如果你需要与中央服务器同步,那就变得更加棘手了.

  • 如果我的硬盘坏了怎么办?[...]那么与登记中央仓库相比,它有何凉爽?

一点都不酷!:-)

但是,即使使用中央存储库,您仍然需要担心工作副本中的未提交数据.因此,我会声称你应该有一个备份解决方案.

根据我的经验,人们通常会使用集中式系统在其工作副本中放置更大量的未提交数据.客户告诉我他们是如何试图说服开发人员每周至少做一次的.

这些变化通常是不公正的,因为:

  1. 他们并没有真正完成.代码中可能有调试打印语句,可能有不完整的函数等.

  2. 承诺将进入trunk,这对于集中式系统来说是危险的,因为它会影响其他所有人.

  3. 提交将要求您首先与中央存储库合并.如果您知道代码中存在其他相互冲突的更改,那么合并可能会令人生畏.合并可能只是令人烦恼,因为您可能不会完成所有更改并且您更喜欢从已知良好状态开始工作.

  4. 当您必须与过载的中央服务器通信时,提交可能会很慢.如果你在离岸地点,提交甚至更慢.

如果您认为上述内容实际上不是集中式与分布式版本控制的问题,那么您是绝对正确的.使用CVCS,人们可以在不同的分支机构工作,因此可以避免上面的2和3.有了一个单独的抛弃分支,我也可以尽可能多地提交,因为我可以创建另一个分支,我提交更多优化的变更(解决1).但是,提交仍然可能很慢,所以4仍然适用.

使用DVCS的人通常会将他们的"本地"提交推送到远程服务器,无论如何都是穷人的备份解决方案.它们不会推送到团队其他成员正在工作的主服务器,而是推送到另一个(可能是私有的)服务器.这样他们就可以孤立地工作并且仍然保持异地备份.

  • 离线工作或在飞机上工作.[...]

是的,我也从不喜欢这个论点.我99%的时间都有良好的互联网连接,并且飞得不够,这是一个问题:-)

但是,真正的论点并不是你离线,而是你可以假装离线.更确切地说,您可以独立工作,而无需立即将更改发送到中央存储库.

DVCS工具是围绕人们可能脱机工作的想法而设计的.这有许多重要的后果:

  • 合并分支变得很自然.当人们可以并行工作时,叉子自然会出现在提交图中.因此,这些工具必须非常善于合并分支.像SVN这样的工具不是很擅长合并!

    Git,Mercurial和其他DVCS工具合并得更好,因为他们在这个领域有更多的测试,而不是直接因为它们是分布式的.

  • 更灵活.使用DVCS,您可以自由地在任意存储库之间进行推/拉变换.我经常在我的家和计算机之间推/拉,而不使用任何真正的中央服务器.当事情准备好发布时,我把它们推到像Bitbucket这样的地方.

    多站点同步不再是"企业功能",它是一种内置功能.因此,如果您有离岸位置,他们可以设置本地集线器存储库并在它们之间使用它.然后,您可以每天,每天或何时适合您同步本地集线器.这只需要运行hg pullgit fetch定期运行的cronjob .

  • 更好的可扩展性,因为客户端有更多的逻辑.这意味着对中央服务器和更强大的客户端工具的维护更少.

    使用DVCS,我希望能够通过修订代码(而不仅仅是提交消息)进行关键字搜索.使用集中式工具,您通常需要设置额外的索引工具.


Von*_*onC 6

DVCS对我来说非常有趣,因为它:

  • 源代码控制流程添加全新维度:发布.
    您不仅拥有合并工作流程,还有一个发布工作流程(您将向哪个存储库推送/拉出),并且可以在以下方面具有许多含义:

    • 开发生命周期(仅为某种类型的提交创建存储库,例如,为了部署目的而将其发布到profuctions中)
    • 独奏任务(您可以推送和更新备份仓库,即使只是一个文件形式)
    • inter-dependencies项目(当项目A的团队正在等待团队项目B最终提交到中央仓库时,它可能会要求B将"中间开发"作为附加的zip文件"传递"到邮件中.现在,所有A必须做的是添加B repo作为潜在的远程,获取它并偷看)
  • 带来了一种新的生产/消费修订方式:

    • 一种产生新修订的被动方式(只有那些积极从你的回购中提取的修订版才会在他们的分支中看到它们)
    • 一种积极的方式来消费他人的修改(通过将他们的仓库添加为远程和从他们那里获取/合并你需要的东西).

这意味着你不依赖于其他人将他们的工作交给中央回购,但你可以与不同的演员和他们的回购有更直接的关系.