2011-03-15 65 views
4

我刚刚遇到了hg push命令的问题。我做了什么 - 首先,我创建了2个分支烫-1烫-2取得了各领域的一些变化,合并回默认和关闭这些分支使用以下命令:Mercurial推送问题

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

只是明确地说:Mercurial可以做一个类似于git的分支模型,它使用非命名分支而不是书签。 – 2012-05-09 12:58:40

回答

5

首先,正如其他人指出的那样,对短期工作使用命名分支并不推荐使用。命名分支主要用于长期生活的功能,或用于发布管理。

鉴于您处在这种情况下,有几个选项可用。所有这些都涉及修改历史记录(因为您显然正在尝试改变您已完成的任务)。

一种方法是按照原样推动分支,从经验中学习,然后继续前进。如果团队的其他成员对此没有问题,那就是向push命令添加“新分支”的情况。

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

如果你不推动,那么肯定要制作一个当前回购的克隆。通过这种方式,您可以复制原始作品。

我在这里看到2个主要方法。取消合并并将您的分支重新设置为默认值。这将消除命名分支或移植/移植您的更改。两者将是相同的最终结果,但实施情况稍有不同。

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

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

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

-D是hg修订选择查询后的字符串。就你而言,你可能只需要'{start} :: {end}',其中start是分支开始处的变更集,end是分支的结束变更集(忽略合并)。

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

另一种选择是剥去最终合并,并用底垫命令是MQ插件的一部分。

你得把你的合并变更摆脱他们,然后更新到你想保留分支的末端。选择第一个命名分支的开始,并进行重新分配。这将改变分支的血统(如果你熟悉Git,那么这很像是重新分配)。

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

+1

有你想要的答案,所以它的定义是正确的答案,但我不愿意添加评论,大多数Mercurial工作流假定不变的历史记录,并安排避免需要'strip'或'rebase'。在这种特定情况下,人们通过避免**命名**分支来实现短期实体。如果这些修补程序是**匿名**分支或**书签**,您不需要用'strip'或'rebase'重写历史记录。在修改历史记录的工具上构建工作流程并不是错误的,它通常不被视为Mercurial最佳实践。 – 2011-03-16 14:24:59

+0

@ Ry4an完全同意。我严格关注这个问题,但应该提到避免这种情况在未来(和第一位)的最佳实践。感谢您确保完成此操作。 – Mikezx6r 2011-03-16 15:06:38

+0

谢谢你的补充。我将很快修改这个问题,将HG的变化包含进去。从2.0开始,有比移植插件更好的命令。新命令是移植,并提供通常的合并帮助。移植不。 – Mikezx6r 2012-05-09 11:31:23

2

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

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

你既然合并了分支为默认情况下,仍将只有一个头(因为你已经在你的本地回购看到)。

如果你真的不能推分支服务器住,那么你必须在Mikezx6r's answer建议重写你的本地历史记录。

除了他提到的方法,也可以导入到的变更补丁队列,并把它们应用到你的默认的一角。

3

只是做了:

hg push --new-branch 

这将在这些分支派,但他们会在接收端也被关闭,所以没有人应该被人打扰。

查看我对为什么命名分支最适合像'stable'这样的长寿命实体以及匿名分支,书签或克隆更适合短时间内容的问题的评论,如热修复和新功能。