0

我有两个 Mercurial repos C1 和 C2,它们都是前一段时间从同一个父 P 派生的,但后来有了不同的开发线。另外,在C2 中,有一个名为B2 的分支,它发生在分流之后。我只想将分支 B2 拉入 C1,我可以使用 hg pull C2 --branch B2 轻松完成。

现在 B2 在 C2 存储库的默认分支中分支了一些点。因此,即使我只是想拉分支 B2,C2 中的那些默认变更集也会被拉入 C1。(我可以理解,因为它们是 B2 变更集的祖先)。

在上述拉取之后,我将在 C1 的默认分支上有两个头,原始头和由那些因拉出 B2 而被拉出的默认变更集组成的头。我想保持 C1 的默认分支不变,否则我有两个头,不断被告知更新“跨分支”并告诉我必须合并。(我将把新的默认分支从其他外部仓库拉到 C1 中)。

我怎样才能做到以上,这样我就没有默认的两个头?

4

1 回答 1

0

想想这个问题,我认为你有这样的事情是对的吗?

@  4[tip]:1   439255c536ee   2013-01-25 10:42 +0000   rob
|    More changes on original default branch
|
|   o  3   379f384c1d73   2013-01-25 10:41 +0000   rob
|   |   Changes on named branch B2
|  /
| o  2:0   d225da266931   2013-01-25 10:40 +0000   rob
| |    Changes on cloned default
| |
o |  1   7088660d3ba6   2013-01-25 10:41 +0000   rob
|/     Changes on original default branch
|
o  0   a02a921256b3   2013-01-25 10:39 +0000   rob
     Project Start

您所描述的问题是,当您想保留B2分支时,您不希望两个头朝上default

$ hg heads default --style=compact
4[tip]:1   439255c536ee   2013-01-25 10:42 +0000   rob
  More changes on original default branch

2:0   d225da266931   2013-01-25 10:40 +0000   rob
  Changes on cloned default

我可以看到两种“解决”这个问题的可能性。一种是简单地关闭“克隆”默认分支(至少在您的存储库中):

$ hg update 2
$ hg commit -m "Closing cloned default" --close-branch
$ hg heads default --style=compact
4[tip]:1   439255c536ee   2013-01-25 10:42 +0000   rob
  More changes on original default branch

这意味着如果你发出一个hg update default,它不应该是模棱两可的,我猜这是问题的一部分。

另一种方法是从另一个默认分支执行“空合并”:

$ hg update
$ hg -y merge --tool=internal:fail 2
$ hg revert --all --rev .
$ hg resolve -a -m
$ hg commit -m "Merged cloned default"

这些方法的主要区别在于,使用该--close-branch选项时,您仍然可以在使用时看到额外的头hg heads -c……它仍然是头,但它只是在元数据中设置了一个标志,表示它已关闭。你仍然可以更新到关闭的分支,甚至提交对它的更改。进行合并你根本看不到头部,因为它不再是头部。

这两种方法都意味着您仍然可以将更改拉到 B2 分支 - 但是,如果在您要从中拉出的存储库中,他们会在默认情况下进行更改并将这些更改合并到 B2(通常在修复错误等时使用),您将点击以后有同样的问题,只好重复上面的。

我希望这是有道理的。当然,如果您稍后推送到另一个仓库,您也将推送关闭/合并的变更集。明智的做法是克隆您的存储库并在本地尝试这些方法以检查这是否是您真正想要的。

于 2013-01-25T10:58:27.550 回答