【问题标题】:Mercurial, pulling a single branchMercurial,拉一根树枝
【发布时间】:2013-01-24 21:57:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • 将 B2 拉入 C1 不会自动在 C1 中创建 B2 在 C2 中的分支吗?

标签: mercurial


【解决方案1】:

考虑一下问题,我认为你有这样的事情是对的吗?

@  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,它不应该模棱两可,我猜这是问题的一部分。

另一种方法是从另一个默认分支执行“null merge”:

$ 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 中(通常在修复错误等时使用),您稍后会遇到同样的问题,并且必须重复上述操作。

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

【讨论】:

  • 谢谢,这似乎可行,而且比我尝试的变基要简单得多。我没有意识到你可以关闭一个未命名的分支,非常有用。我注意到当我最终推送到主仓库时(使用 push --new-branch),仍然有一条消息说 push 创建了新的远程头,但我使用了 -f 并且对未来的 hg 更新等没有问题。跨度>
  • 如果你使用空合并选项,你不应该得到“推送创建一个新的远程头”。但是,创建新远程头的问题在于它会产生歧义——“我应该更新到什么?”。因此,如果您关闭了分支,它无论如何都会消除这种歧义。
猜你喜欢
  • 2019-10-18
  • 2022-01-02
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多