颠覆用户的思考:Mercurial术语中的“分支”是什么?

时间:2010-01-21 11:34:59

标签: mercurial branch dvcs

我是Subversion的用户,我想我现在已经全身心投入其中。所以当然现在我们正在考虑转向Mercurial,我需要重新开始。

在我们的单一存储库中,我们有典型的branchestagstrunk布局。当我想创建一个功能分支时我:

  • 使用repo浏览器将trunk复制到branches/Features/[FeatureName]
  • branches/Features/[FeatureName]签出新的工作副本。
  • 开始研究它。
  • 偶尔提交,合并trunk,解决冲突并提交。
  • 完成后,再合并trunk,然后将功能分支“重新整合”为主干。

(请注意,此过程已简化,因为它没有考虑发布候选分支等)。

所以我对Mercurial中如何满足相同要求(即功能分支而不是在主干上工作)有疑问:

  • 在Mercurial中,仍然是存储库中的分支,还是一个全新的本地存储库?
  • 如果我们每个人都有整个存储库的副本,这是否意味着我们都拥有彼此各个功能分支的副本(这是很多数据传输)?
  • 我知道Mercurial是一个DCVS,但这是否意味着我们直接推送/拉取更改,而不是通过服务器上的对等存储库?

3 个答案:

答案 0 :(得分:9)

答案 1 :(得分:7)

  

在Mercurial,仍然是一个分支   存储库,还是全新的   本地存储库?

颠覆工作方式的等价物是mercurial中multiple heads的存储库。然而,这不是惯用的做事方式。通常,在给定的存储库中只有一个头,因此每个分支都有单独的存储库。

  

如果我们每个人都有一份整体的副本   存储库,这是否意味着我们都有   彼此的各种功能的副本   分支(这是很多数据   转移)?

是的,如果您查看本地存储库头部的历史记录,那么您将能够看到所有已合并的功能分支。但是,mercurial存储库非常节省空间。例如,我已经完成了hg clone https://www.mercurial-scm.org/repo/hg以获取mercurial本身的源,并且在NTFS文件系统上只有34.3 MB(与source code download相比,这是1.8 MB)。如果您的文件系统支持硬链接,Mercurial也会使用硬链接,因此如果您将存储库克隆到同一磁盘上的另一个位置,则几乎没有开销。

  

我知道Mercurial是DCVS,但确实如此   这意味着我们推动/拉动变化   彼此直接,而不是通过   服务器上的对等存储库?

一种工作方式确实是让每个开发人员公开一个公共存储库,在其中推送自己的更改。然后所有其他开发人员都可以获得他们想要的东西。

但是,通常您将拥有一个或多个“祝福”存储库,其中集成了所有更改。然后,所有开发人员只需要从受祝福的存储库中提取。即使你没有明确拥有这样一个受祝福的存储库,我想人们会自动组织这样的自己,例如所有人都是从首席开发人员处获取的。

答案 2 :(得分:5)

史蒂夫·罗什(Steve Losh)关于在上面关联的mercurial分支的文章太棒了。我还讨论了分支以及DAG如何在a presentation I gave a couple of months ago on mercurial that's out on slideshare中工作。相关幻灯片从幻灯片#43开始。

我认为理解所有提交到同一存储库的提交存储在DAG(有向无环图)中,并带有一些简单的规则,这有助于揭开正在发生的事情的神秘面纱。

  • 没有子节点的节点是“头”
  • 根节点没有父母
  • 常规节点具有单个父级
  • 合并后的节点有两个父母
  • 如果合并节点的父节点来自不同的分支,则子节点的分支从第一个父节点继承

命名分支实际上只是提交中的元数据标签,但实际上与将某些elses工作合并到存储库时发生的匿名分支没有任何不同,或者如果您返回到早期版本然后进行提交有一个新的头(你可以稍后合并)。