我刚刚遇到hg push
命令问题.我做了什么 - 首先我创建了2个分支hot-fix-1和hot-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中可以使用类似的分支模型.谢谢
首先,正如许多其他人所指出的那样,使用命名分支进行短期工作并不是推荐的做法.命名分支主要用于长期存在的功能,或用于发布管理.
鉴于您处于这种情况,可以选择一些选项.所有这些都涉及修改历史(因为你显然试图改变你已经完成的事情).
一个是按原样推动分支,从经验中学习,然后继续前进.如果团队的其他成员对此很好,那么就可以在你的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的长分支.