mercurial中的最佳实践:分支与克隆,以及部分合并?

时间:2009-01-15 21:41:58

标签: mercurial merge branch

...所以我已经习惯了Mercurial(addcommitdiff)的简单内容,并了解了.hgignore文件(是的!)和已经掌握了在分支之间创建和切换的问题(branchupdate -C)。

我有两个主要问题:

  1. 如果我在分支“Branch1”并且我想从分支“Branch2”中提取一些但不是所有的更改,我该怎么做?特别是如果所有更改都在一个子目录中。 (我想我可以克隆整个存储库,然后使用像Beyond Compare这样的目录合并工具来选择和选择我的编辑。看起来应该有一种方法来隔离一个文件或一个目录中的更改。 )

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

    一个。如果我需要同时对两个版本/分支进行操作(例如,执行性能指标差异)

    湾用于备份(clone存储库到物理上不同位置的网络驱动器)

    ℃。像我上面提到的那样选择和选择合并。

3 个答案:

答案 0 :(得分:50)

我使用克隆:

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

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

  • 我一直在努力改变我的同伴,并将他们拉出来。
  • 当我方便的时候,我会把所有这些分支的变化合并到我的。

对于功能分支或更长寿的分支,我使用命名分支,这些分支在存储库之间更舒适地共享而不进行合并。当你想有选择地合并时,它也“感觉”更好。

基本上我这样看:

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

这是我的看法,但实际上这是政策问题。

答案 1 :(得分:29)

对于问题1,您需要更清楚地了解“变化”的含义。你的意思是:

  1. “我想把不同分支中的一些变更集但不是全部变成这个变种集。”
  2. “我想把不同分支中的某些文件中的一些但不是全部的最新版本提取到此版本中。”
  3. 如果您的意思是第1项,那么您应该查看Transplant扩展名,特别是如果想要挑选一些变更集。

    如果您的意思是第2项,您将执行以下操作:

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

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

答案 2 :(得分:3)

我还有另一种选择:mercurial队列。

这个想法是,在当前工作目录的顶部有一堆补丁(没有提交,“真正的”补丁)。然后,您可以添加或删除应用的补丁,添加,删除,添加另一个补丁等。一个补丁或其中一个子集最终成为一个新的“功能”,因为您可能想要使用分支。之后,您可以照常应用补丁(因为它是一个更改)。如果你和其他人一起工作,分支机构可能会更有用......?