我有两个Mercurial repos C1和C2,它们都来自同一个父P,但后来有了不同的开发线。另外,在C2中,有一个命名分支B2,它发生在转移之后。我想只将分支B2拉入C1,我很容易用hg拉C2 - 分支B2。
现在B2分支C2 repo的默认分支中的某些点。因此,即使我只是试图拉动分支B2,来自C2的那些默认变更集也会被转移到C1中。 (我可以理解,因为它们是B2变更集的祖先)。
在上面的拉动之后,我将在C1的默认分支上有两个头,原始头部和头部由那些由于拉过B2而被拉过来的默认变化集组成。我想保持C1的默认分支不变,否则我有两个脑袋,不断被告知更新“跨分支”并告诉我必须合并。 (我将从其他外部回购中将新的默认分支内容拉入C1)。
如何执行上述操作,以便默认情况下我没有两个头?
答案 0 :(得分: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
,不应该含糊不清,我猜这是问题的一部分。
另一种方法是从另一个默认分支执行“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中(通常在错误修正等时使用),将在以后遇到同样的问题,并且必须重复上述内容。
我希望这是有道理的。当然,如果您以后推送到另一个仓库,您也将推送已关闭/合并的变更集。克隆你的回购并在本地尝试这些方法以检查这是否是你真正想要的东西是明智的。