Mercurial推问题

Dmy*_*tro 4 mercurial push

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

hg commit --close-branch  
Run Code Online (Sandbox Code Playgroud)

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

default      29:e62a2c57b17c
Run Code Online (Sandbox Code Playgroud)

hg branches -c 给我:

default                       29:e62a2c57b17c
hot-fix-2                     27:42f7bf715392 (closed)
hot-fix-1                     26:dd98f50934b0 (closed)
Run Code Online (Sandbox Code Playgroud)

因此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)
Run Code Online (Sandbox Code Playgroud)

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

PS我以前使用git并且希望在Mercurial中可以使用类似的分支模型.谢谢

Mik*_*x6r 5

首先,正如许多其他人所指出的那样,使用命名分支进行短期工作并不是推荐的做法.命名分支主要用于长期存在的功能,或用于发布管理.

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

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

如果团队的其他成员,或者你真的希望历史变得干净,那么你需要深入挖掘.

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

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

如果您只想使用移植物,那么现在这是一个以HG 2.0开头的内置功能.它取代了移植插件,使用起来更好,因为如果存在冲突,它会使用您通常的合并工具.

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

hg graft -D "2085::2093 and not 2091"
Run Code Online (Sandbox Code Playgroud)

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

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

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

你必须剥离你的合并变更集以摆脱它们,然后更新到你想要保留的分支的尖端.选择第一个命名分支的开头,然后执行rebase.这将改变分支的亲子关系(如果你熟悉Git,那么这非常像它的rebase).

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