Новая дистанционная головка при нажатии на новую ветку


Я создал филиал named в mercurial, внес некоторые изменения, и теперь я хочу вернуть его в центральное РЕПО. Я сделал выборку, проверил, что у меня нет изменений для слияния, но когда я пытаюсь сделать толчок, я получаю сообщение push creates new remote head, но я не понимаю, почему. Я единственный dev на этой ветви, и она все еще локальна для моего репозитория.

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

Есть идеи?

Edit : извините за любую путаницу, это является именованной ветвью, созданной hg branch mybranch

Update : использование 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 7

2 ответа:

Путаница заключается в том, что флаг --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 предназначен только для названные ветви . Mercurial обычно прерывается, если вы отправляете новую именованную ветвь в удаленный репозиторий. Добавление флага --new-branch - это то, как вы говорите ему идти вперед.

К сожалению, у нас нет специального флага --create-new-feature-branch. У нас есть только флаг --force, который говорит Mercurial идти вперед и создать две головы в удаленном хранилище. Недостатком --force является то, что он отменяет все проверки безопасности: вы можно нажать три или более новых головы с этим флагом, и вы даже можете нажать в несвязанное хранилище. Поэтому вы должны использовать hg outgoing, чтобы дважды проверить, что вы собираетесь толкать.

Я писал выше, что несколько голов на сервере сбивают с толку, так как новый клон будет обновлен до случайной головы. Чтобы избежать путаницы, вы можете дать названия ветвям функций, поместив их в закладки . Вы все равно будете обновлены до случайной головы, но hg bookmarks покажет вам доступные ветви функций и вы затем можно обновить до нужного. Поэтому, если вы используете такой рабочий процесс, то продолжайте с hg push -f.

Просто волшебным образом разрешил это, но до сих пор не ясно, почему. Похоже, это действительно проблема с default, хотя я не работаю над этой веткой. Я мог бы позвонить >hg branch и получить ожидаемое имя ветви.

У меня было изменение в моей локальной ветви default, которое не было выдвинуто и не хотело. Я отступил от этого изменения,а затем совершил его. Затем я сделал fetch на ветке по умолчанию и объединил ее с моей веткой функций. Затем снова на default я слился с набором изменений по умолчанию, из которого я вышел Я верю. В какой-то момент во время этого процесса я получил еще одну голову, которая, вероятно, вызвала множественные слияния.

Все это, кажется, сводится к существующим головам по умолчанию, но я все еще не знаю, почему (или почему мы хотели бы), что влияет на отдельную именованную ветвь.

Все это кажется слишком сложным для того, что я ожидаю (и что каждый может просто нарисовать в диаграммах ascii)

Edit

Похоже, что проблема возникла во время начальной может быть, ветка. Похоже, что я разветвился дважды и [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)