Почему Mercurial иногда допускает слияние с предком? - PullRequest
2 голосов
/ 22 марта 2012

Я озадачен этой историей репо .На этой странице вы увидите небольшую ветвь file-content, которая объединена с веткой default, хотя одна голова была предком другой.

Когда я пытаюсь сделать что-то подобноеЯ получаю сообщение об отмене, если только

  1. боковая ветвь не закрыта, и
  2. я сливаюсь от предка к закрытой головке ветви (но не наоборот).(В этом репо ветка file-content помечена как неактивная, а не закрытая.)

Редактировать: реальные условия, при которых вы можете объединиться с предком, описаны в моем ответе.

Так что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Это странно плохо документировано, но если вы перейдете по ссылке внизу https://www.mercurial -scm.org / wiki / Merge , вы увидите, что есть исключение из правила против слияния спредок.Это не требует, чтобы потомок был закрытой ветвью, как я изначально предполагал.Вместо этого:

  1. Вы должны выполнить слияние с предком (т. Е. Рабочий каталог должен быть обновлен до предка, а не другого набора изменений)
  2. Имена ветвей родителя рабочего каталога инабор изменений, с которым вы объединяетесь, должен отличаться.Например, у одного по умолчанию имя ветки, у другого - имя ветки feature-X

. Это дает нам возможность начать новую ветвь и объединить ее обратно, даже если мы не работаем над ней.первоначальная ветвь между тем.

3 голосов
/ 22 марта 2012

Нет технической причины, по которой вы не можете слиться с предком: как вы узнали, Mercurial поддерживает это в некоторых обстоятельствах.Так что это чисто ограничение GUI.Причиной этого является то, что когда hg update даст вам тот же результат, что и hg merge, тогда вы должны использовать его вместо этого для простоты.

A слияние - это просто смесь трехсостояние хранилища: общий предок и две ревизии, которые вы объединяете.Трехстороннее слияние выполняется по принципу «кусок-за-лом».Таблица для слияния local с remote выглядит следующим образом:

ancestor  local  remote -> merge
old       old    old       old (nobody changed the hunk)
old       new    old       new (I changed the hunk)
old       old    new       new (you changed the hunk)
old       new    new       new (hunk was cherry picked onto both branches)
old       foo    bar       <!> (conflict, both changed hunk but differently)

Если local является предком remote, то ancestor == local.Таким образом, таблица становится такой:

ancestor  local  remote -> merge
old       old    old       old (nobody changed the hunk)
old       old    new       new (you changed the hunk)

В обоих случаях столбец merge содержит то, что было в столбце remote.В вашем примере local - это default, а remote - file-content:

$ hg update default
$ hg merge file-content

Результатом является набор изменений слиянием, который выглядит так же, как file-content.

...