2012-02-27 2 views
7

Я создал ветку named в mercurial, совершил некоторые изменения, и теперь я хочу оттолкнуть это назад к центральному репо. Я сделал выборку, подтвердил, что у меня нет изменений для слияния, но когда я пытаюсь сделать push, я получаю сообщение 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) 

Любые идеи?

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

Update: использование hg heads дает несколько голов все в разных ветках. У меня есть один для моей отрасли, и один под умолчанием:

changeset: 515:97b9a7802751 
branch:  mybranch 
user:  me <[email protected]> 
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 <[email protected]> 
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 <[email protected]> 
date:  Thu Feb 09 11:41:32 2012 -0800 
files:  CipherKey.cs 
description: 
removing ambiguous characters - CAC-47 
+1

'рт.ст. heads' покажет вам все головы. Это должно сказать вам, где 'c3064f3cf1b7' стоит вместе с другими головами. –

+1

Folow-up to @JoelBFant: 'hg log -r c3064f3cf1b7'. Кажется, у вас нет новой именованной ветки, но анонимная ветка по умолчанию –

+0

добавила дополнительную информацию о филиале. Я почти уверен, что это именованная ветвь ... – earthling

ответ

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

+0

Я обновил сообщение, чтобы уточнить, что я использую именованную ветку. – earthling

+0

Я печатаю 'hg branch', и я получаю свое имя ветки:' php7' в отличие от 'default'. Но я все еще не мог нажать «-ново-ветвь». Означает ли это, что меня не было в названной ветке? Как это возможно? Я нашел единственный способ нажать «hg push -f», но это не понравилось моей новой ветви с именем «php7» –

Смежные вопросы