推送新分支时需要新的远程头

7

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

1
hg heads会显示所有的heads。这应该可以告诉你c3064f3cf1b7与其他heads的位置。 - Joel B Fant
1
回复 @JoelBFant:hg log -r c3064f3cf1b7。看起来你没有新的命名分支,而是在默认分支上有一个匿名分支。 - Lazy Badger
在分支上添加了更多信息。我非常确定它是一个命名分支... - earthling
你已经从另一个仓库拉取了所有想要推送到“default”分支的内容了吗? - Joel B Fant
我还没有在“default”上工作,也没有准备好合并回去。我真的需要切换到“default”并拉取吗? - earthling
2个回答

14

令人困惑的是,当推送特性分支(也称为匿名分支)时,--new-branch 标志没有任何效果。匿名分支看起来像这样:

... [a] --- [b] --- [c] <- the servers head on default
               \
                [x] --- [y] <- my feature branch on default

所有更改集都在 default 分支上,因此您现在在 default 上有两个分支。 当您进行推送时,将在服务器上创建两个分支 — 但是 Mercurial 在此之前会中止,并显示您看到的警告。 它中止是因为在服务器上具有多个分支会引起混淆:当您 hg clone 时,您的工作副本将随机更新为其中一个分支。

--new-branch 标志仅用于命名分支。如果您要将新的命名分支推送到远程存储库,则Mercurial通常会中止操作。添加 --new-branch 标志是告诉它继续执行。

不幸的是,我们没有专门的 --create-new-feature-branch 标志。我们只有 --force 标志,它告诉Mercurial继续在远程存储库中创建两个分支。使用 --force 的缺点是它覆盖了所有安全检查:您可以使用该标志推送三个或更多个新分支,甚至可以将其推送到不相关的存储库中。因此,您应该使用 hg outgoing 来双重检查要推送的内容。

我上面写到,在服务器上有多个分支会引起混淆,因为新的克隆将更新为随机分支。为避免混淆,可以通过给它们添加书签来为功能分支命名。您仍然会更新为随机分支,但是 hg bookmarks 将显示可用的功能分支,然后您可以更新到正确的分支。因此,如果您正在使用这种工作流程,则可以使用 hg push -f 命令进行推送。


我输入hg branch,得到我的分支名:php7,而非default。但我仍然无法使用--new-branch进行推送。这是否意味着我没有在命名分支中?这怎么可能?我发现唯一的推送方式是hg push -f,但对于我新命名的php7分支来说,这感觉不太对。 - Jonathan

1

刚刚神奇地解决了这个问题,但仍不清楚原因。尽管我没有在那个分支上工作,但它似乎是与 default 有关的问题。我可以调用 >hg branch 并获取预期的分支名称。

我的本地 default 分支发生了变化,但没有推送,也不想要。我回退了该更改,然后进行了提交。然后我在 default 分支上进行了一次 fetch,并将其合并到我的功能分支中。然后回到 default,我与我认为已经回退的默认值进行了合并。在此过程中的某个时候,我又得到了另一个 head,这可能导致了多个合并。

所有这些都似乎归结为 default 上现有的 heads,但我仍然不知道为什么(或者为什么我们想要这样做)会影响到单独命名的分支。

对于我所期望发生的事情来说,所有这些都显得过于复杂了(而且每个人都可以简单地在 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接