我刚刚遇到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中可以使用类似的分支模型。感谢
答案 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中的建议重写本地历史记录。
除了他提到的方法之外,您还可以将更改集导入修补程序队列并将其应用到默认提示。