Mercurial推问题

时间:2011-03-15 15:38:43

标签: mercurial push

我刚刚遇到hg push命令的问题。我做了什么 - 首先我创建了2个分支 hot-fix-1 hot-fix-2 在每个分支中做了一些更改,将其合并回默认< / strong>并使用以下命令关闭这些分支:

hg commit --close-branch  

如果我开始hg branches,我有以下输出:

default      29:e62a2c57b17c

hg branches -c给了我:

default                       29:e62a2c57b17c
hot-fix-2                     27:42f7bf715392 (closed)
hot-fix-1                     26:dd98f50934b0 (closed)

因此hot-fix-*分支似乎已关闭。但是,如果我尝试推送更改,则会出现下一条错误消息:

pushing to /Users/user1/projects/mercurial/mytag
searching for changes
abort: push creates new remote branches: hot-fix-1, hot-fix-2!
(use 'hg push --new-branch' to create new remote branches)

并且使用hg push -b .hg push -b default的哪个命令无关紧要 所以问题是如何在不创建新分支的情况下将这些更改推送到存储库。

P.S我曾经使用过git,并且希望在Mercurial中可以使用类似的分支模型。感谢

3 个答案:

答案 0 :(得分:5)

首先,正如许多其他人所指出的那样,建议不要使用命名分支进行短期工作。命名分支主要用于长期功能或发布管理。

鉴于您处于这种情况,可以选择一些选项。所有这些都涉及修改历史(因为你显然试图改变你所做的事情)。

一个是按原样推动分支,从经验中学习,然后继续前进。如果团队的其他成员对此很好,那么就可以在你的push命令中添加--new-branch。

如果团队的其他成员或者您真的希望历史记录清晰,那么您需要深入挖掘。

如果你没有推动,那么一定要克隆你当前的回购。通过这种方式,您可以获得原始作品的副本。

我在这里看到两种主要方法。剥离合并并将分支重新绑定为默认值。这将删除指定的分支或移植/移植您的更改。两者都是相同的最终结果,但实现略有不同。

如果您只想使用graft,那么现在这是一个以HG 2.0开头的内置函数。它取代了移植插件,并且如果存在冲突,它使用您通常的合并工具会更好。

要使用它,请更新到默认分支。然后,使用命令:

hg graft -D "2085::2093 and not 2091"

-D之后的字符串是hg修订选择查询。在您的情况下,您可能只需要'{start} :: {end}',其中start是分支开头的变更集,end是分支的结束变更集(忽略合并)。

如果您进行了多次合并,则必须更精确地选择更改集。

另一个选项是去除最终的合并,并使用作为mq插件一部分的rebase命令。

您必须删除合并更改集以删除它们,然后更新到要保留的分支的提示。选择第一个命名分支的开头,然后执行rebase。这将改变分支的亲子关系(如果你熟悉Git,那么这非常像它的rebase)。

然后重复第二个分支。您现在应该有一个名为default的长分支。

答案 1 :(得分:3)

只需执行:

hg push --new-branch

它会发送到那些分支机构,但它们也会在接收端关闭,所以没有人应该被打扰。

请参阅我的评论,为什么命名分支最好保存为长期存在的实体,如'稳定',匿名分支,书签或克隆更适合短期内的事情,如热修复和新功能。

答案 2 :(得分:2)

您对分支机构进行了hot-fix更改。无论分支是活动的还是关闭的,它都存在。

要将更改推送到服务器(不重写历史记录),您必须使用--new-branch选项(例如hg push --new-branch`)。

由于您将分支合并为默认分支,因此仍然只有一个分支(正如您在本地仓库中看到的那样)。

如果您真的无法将分支机构推送到服务器,那么您必须按照Mikezx6r's answer中的建议重写本地历史记录。

除了他提到的方法之外,您还可以将更改集导入修补程序队列并将其应用到默认提示。