推新分支时新的远程头

时间:2012-02-27 23:18:38

标签: mercurial push branching-and-merging

我在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

2 个答案:

答案 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)