我在mercurial中创建了一个named
分支,进行了一些更改,现在我想将其推回到中央仓库。我已经完成了一次获取,验证我没有合并的更改,但是当我尝试进行推送时,我收到了消息push creates new remote head
,但我不明白为什么。我是这个分支的唯一开发者,它仍然是我的存储库的本地。
>hg fetch (pull/update/merge)
>hg status (shows nothing)
>hg push --new-branch mybranch
searching for changes
new remote heads on branch 'default'
new remote head c3064f3cf1b7
abort: push creates new remote head c3064f3cf1b7!
(did you forget to merge? use push -f to force)
有什么想法吗?
修改:抱歉有任何疑惑,此是由hg branch mybranch
更新:使用hg heads
会在不同分支上产生多个头。我有一个用于我的分支,一个在默认情况下:
changeset: 515:97b9a7802751
branch: mybranch
user: me <me@mymail.com>
date: Mon Feb 27 13:21:54 2012 -0800
files: CryptoRandom.cs
description:
fixing error message for size of max
changeset: 504:c3064f3cf1b7
user: me <me@mymail.com>
date: Thu Feb 09 11:41:32 2012 -0800
files: CipherKey.cs
description:
removing ambiguous characters - CAC-47
使用hg log -r c3064f3cf1b7
会产生以下内容(这是默认情况下的头部):
changeset: 504:c3064f3cf1b7
user: me <me@mymail.com>
date: Thu Feb 09 11:41:32 2012 -0800
files: CipherKey.cs
description:
removing ambiguous characters - CAC-47
答案 0 :(得分:14)
令人困惑的是,--new-branch
标志在推送功能分支(也称为 anynomous 分支)时无效。匿名分支看起来像这样:
... [a] --- [b] --- [c] <- the servers head on default
\
[x] --- [y] <- my feature branch on default
所有更改集都在default
上,因此您现在default
上有两个头。当您按下时,您将在服务器上创建两个磁头 - 但Mercurial会在此之前使用您看到的警告中止。由于在服务器上有多个磁头令人困惑,它会中止:当你hg clone
时,你的工作副本将被更新为其中一个,几乎是随机的。
--new-branch
标志仅适用于named branches。如果将新的命名分支推送到远程存储库,Mercurial通常会中止。添加--new-branch
标志就是告诉它如何继续。
不幸的是,我们没有专用的--create-new-feature-branch
标志。我们只有--force
标志,告诉Mercurial继续在远程存储库中创建两个头。 --force
的缺点是它取代了所有安全检查:你可以使用该标志推送三个或更多新头,甚至可以推入一个不相关的存储库。
因此,您应该使用hg outgoing
来仔细检查您要推送的内容。
我在上面写道,服务器上的多个磁头令人困惑,因为新的克隆将更新为随机磁头。为避免混淆,您可以通过书签为其提供功能分支名称。您仍将更新为随机头,但hg bookmarks
将显示可用的功能分支,然后您可以更新到正确的功能分支。因此,如果您正在使用此类工作流程,请继续使用hg push -f
。
答案 1 :(得分:1)
只是神奇地解决了这个问题,但仍然不清楚原因。 default
似乎确实存在问题,即使我没有在该分支上工作。我可以调用>hg branch
并获取预期的分支名称。
我的本地default
分支机构发生了更改,但未被推送,并且不想要。我退出了那个改变然后做出了承诺。然后我在默认分支上执行了fetch
并将其合并到我的功能分支。然后回到default
我合并了默认情况下的变更集,我相信我退出了。在那个过程中的某个时刻,我得到了另一个头,这可能导致多次合并。
这一切似乎归结为默认的现有头部,但我仍然不知道为什么(或者我们想要的原因)会影响一个单独的命名分支。
对于我期望发生的事情(以及每个人都可以简单地在ascii图中绘制出来),这一切看起来都过于复杂了。
修改强>
看起来问题可能源于最初的分支。看起来我分支了两次,[j]
是默认的匿名分支。
可视化[j]
上似乎正在发生的事情是我退出的变更集,[k]
是我对mybranch的第一次提交:
[a] -- [b] -- [c] -- [d] -- [e] (default)
\ \ /
[j]-----------\--- (not sure where this branch came from)
\ \
[k] -- [l] -- [m] (mybranch. Still separate from default)