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

... 所以我已经习惯了 Mercurial (addcommitdiff)的简单东西,并发现了。Hgignore 文件(耶!)并且掌握了在分支之间创建和切换的窍门(branchupdate -C)。

不过,我有两个主要问题:

  1. 如果我在分支“ Branch 1”中,并且我想从分支“ Branch 2”中获取一些但不是全部的更改,那么我该如何做呢?特别是当所有更改都在一个子目录中时。(我想我可以克隆整个存储库,然后使用像 Beyond Compare 这样的目录合并工具来选择我的编辑。不过,似乎应该有一种方法可以将更改隔离在一个文件或一个目录中。)

  2. 使用 update -C在分支之间切换似乎很容易,我不知道为什么要使用 clone。我只能想到几个原因(见下文)——是否还有其他原因我没有想到?

    如果我需要同时处理两个版本/分支(例如,执行一个性能指标 diff)

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

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

26536 次浏览

我还有另一个选项可供您查看: 反复无常的队列。

我们的想法是,在你当前的工作目录上面放一堆补丁(不提交,“真正的”补丁)。然后,您可以添加或删除应用的补丁,添加一个,删除它,添加另一个等。一个补丁或者它们的一个子集最终会成为一个新的“特性”,正如您可能希望对分支所做的那样。之后,您可以像往常一样应用补丁(因为它是一个更改)。如果你和其他人一起工作,分支可能更有用?

我用克隆来表示:

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

前一种用法对我来说非常少见——主要是当我在尝试一个我可能想完全放弃的想法时。如果我想合并,我会想合并所有的变化。这种分支主要用于跟踪不同开发人员的分支,这样它们就不会相互干扰。只是为了澄清最后一点:

  • 我一直在做我的改变,然后把我的开发人员的改变拉出来,他们也拉出我的改变。
  • 如果方便的话,我会把这些分支中的一个(或全部)所有的变化合并到我的分支中。

对于特性分支,或者生存时间更长的分支,我使用命名分支,它们在不进行合并的情况下更容易在存储库之间共享。当你想有选择地合并时,它也会“感觉”更好。

基本上我是这么看的:

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

这是我的看法,不过这实际上是一个政策问题。

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

  1. “我想把不同分支中的一些变更集(但不是全部)拉到这个变更集中。”
  2. “我想把 文件的一些(但不是全部)最新版本,放在另一个分支机构中,放在这个分支机构中。”

如果您指的是项目1,那么您应该查看 移植扩展,特别是挑选几个变更集的想法。

如果你指的是第2项,你应该做以下事情:

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

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