mercurial的最佳实践:分支与克隆,还是部分合并?

…所以我已经习惯了Mercurial( addcommitdiff )的简单的东西,发现了.hgignore文件(耶!),并得到了创build和分支之间切换( branchupdate -C )。

我有两个主要的问题:

  1. 如果我在分支“Branch1”中,并且想从分支“Branch2”中引入一些但并非全部的更改,那我该怎么做? 特别是如果所有更改都在一个子目录中。 (我想我可以只克隆整个资源库,然后使用Beyond Compare这样的目录合并工具来select我的编辑,好像应该有一种方法来隔离一个文件或一个目录中的变化)。

  2. 切换与update -C分支之间似乎很容易,我想知道为什么我会打扰使用clone 。 我只能想到几个原因(见下文) – 我还有其他一些原因吗?

    一个。 如果我需要一次执行两个版本/分支(例如,执行性能度量比较)

    湾 进行备份(将存储clone到物理位置不同的networking驱动器)

    C。 像我上面提到的那样进行select合并。

我使用克隆为:

  • 短命的当地分支机构
  • 克隆到不同的开发机器和服务器

前者的使用对我来说是非常罕见的 – 主要是当我正在尝试一个想法时,我可能会完全放弃。 如果我想合并,我想要合并所有的更改。 这种分支主要是为了跟踪不同开发商的分支,所以他们不会互相干扰。 只是为了澄清这最后一​​点:

  • 我一直在努力改变我的改变,并把我的同事们的改变拉到我的手中。
  • 当我方便的时候,我将把这些分支中的一个(或全部)的所有变化合并到我的。

对于function分支或更长寿命的分支,我使用命名分支,这些分支更容易在不同的存储库之间共享。 当你想select合并时,它也“感觉”更好。

基本上我是这样看的:

  • 命名分支用于开发应用程序的不同分支或版本
  • 克隆用于pipe理对相同版本的应用程序的不同贡献。

这是我的承诺,虽然这是一个政策问题。

对于问题1,你需要更清楚一点你所说的“变化”是什么意思。 你的意思是:

  1. “我想把一个不同部门的一些变化集合,但不是全部变成这个变化集团。”
  2. “我想把最新版本的一些,但不是全部,在不同的分支到这个文件 。”

如果你的意思是项目1,你应该看看移植扩展,特别是Cherrypicking几个变更集的想法。

如果你的意思是项目2,你会做到以下几点:

  • 更新到要将更改引入的分支。
  • 使用hg revert -r <branch you want to merge> --include <files to update>将这些文件的内容更改为其他分支上的内容。
  • 使用hg commit将这些更改作为新的变更集hg commit给分支。

至于问题2,我从不使用仓库克隆来分支自己,所以我不知道。 我使用命名分支或匿名分支(有时与书签)。

我有另一种select,你可以看看:mercurial queues。

这个想法是,在当前工作目录的顶部有一堆补丁(没有提交,“真正的”补丁)。 然后,您可以添加或删除应用的修补程序,添加一个,删除它,添加另一个修补程序等。一个修补程序或它们的一个子集最终将成为一个新的“function”,因为您可能想要使用分支。 之后,你可以像往常一样应用补丁(因为这是一个变化)。 如果你和其他人一起工作,分支可能会更有用…?