Короткий ответ - нет: объединяет работу в соответствии с топологией графа, а не с именами ветвей.
Более длинного ответа все еще нет, но стоит нарисовать топологию. Ваше описание говорит о происхождении ветви, но сами ветви не имеют отношений родитель / потомок. Ветви - это просто наборы коммитов, каждый из которых содержит имя ветки. ( У коммитов есть родитель / потомок или, в более общем смысле, отношения предок / потомок.) Итак:
У меня есть ветвь a1, родительская ветвь которой - A.
Это действительно означает, что у вас есть некоторые коммиты с именем ветви a1
, и один или несколько из этих коммитов имеют родительский коммит (ы) чья ветвь называется A
. Если мы нарисуем их, мы получим, например:
A: ...--o--o--o
\
a1: o--o
Теперь я создал другую ветку a2 от того же родителя A.
Опять же, это просто означает, что у вас есть еще больше коммитов (с их номерами оборотов), чья ветвь имеет имя a2
; по крайней мере один такой коммит имеет родителя с именем ветви A
; мы могли бы нарисовать это любым количеством способов, но давайте попробуем это:
a2: o--o
/
A: ...--o--o--o
\
a1: o--o
Я хочу объединить a1 с a2, исключая chengeset из a1.
Вы действительно не сливаете ветвей . Вместо этого вы объединяете коммитов . Вы делаете это, когда какая-то фиксация извлекается в рабочее дерево - эта копия рабочего дерева является предложенным следующим коммитом - и вы, по определению, находитесь в какой-то ветви. Затем вы запускаете hg merge
и указываете другую ревизию: коммит, который находится в этой или любой другой ветке. Предполагая, что слияние имеет смысл, Mercurial начинает процесс слияния. Когда слияние завершено, новый коммит будет иметь вашу текущую ветвь в качестве своей ветви, а родительский коммит рабочего дерева будет его первым родителем, а предоставленная ревизия - вторым родителем.
Здесь вы можете hg update a2
выбрать подсказку a2
в качестве коммита, скопированного в рабочее дерево. Рабочее дерево - это предложенный, но еще не актуальный новый коммит для a2
, а его родительский элемент - коммит, теперь помеченный @
:
a2: o--@
/
A: ...--o--o--o
\
a1: o--o
Есть ли способ частично объединить ветку, исключая набор изменений?
Вы можете выбрать любой из двух (здесь мы только что нарисовали два) коммитов, которые находятся на a1
в качестве цели для операции hg merge
. Допустим, вы выбрали second one, используя hg merge a1
:
a2: o--@
/
A: ...--*--o--o
\
a1: o--●
Заполненный круг - это обязательство слиться; @
является родителем рабочего дерева; поэтому *
является их базой слияния - лучшим коммитом общего предка. Mercurial будет сравнивать содержимое снимка в *
с содержимым снимка в @
(или в рабочем дереве - эти значения должны быть одинаковыми при запуске процесса), а также сравнивать содержимое снимка в *
для тех, кто в ●
. Каждое из этих двух сравнений производит массовое изменение: содержание в ●
изменяется по сравнению с * в 1064 * между *
и ●
. Merge просто объединит эти две массовые ревизии (которые затем будут применены к содержимому базы).
Конечно, вы можете выбрать другой a1
коммит для слияния, но тогда вы будете использовать его снимок, а не тот для ●
. Это фактически исключит изменения в ●
- вероятно, не то, что вы хотите.
Давайте нарисуем еще один третий график, поскольку этот конкретный график немного поверхностен для наших целей. Предположим, что вместо двух коммитов, исключающих a1
, у нас их много. Но один из них, который мы нарисуем здесь как x
, мы бы хотели исключить при объединении в @
:
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o [want to merge this commit]
Чтобы достичь того, что вы делаете , вы должны сначала сделать новые коммиты, возможно, на a1
, возможно, на новой ветке целиком. Эти новые коммиты будут выглядеть так:
a2: o--@
/
A: ...--*--o--o
\
o--o--o--x--o--o--o
a1: \
----o--o--o
В тВ этом случае я нарисовал новые коммиты как новую мини-ветку в пределах a1
, но, возможно, было бы яснее сделать их в новой ветке a3
:
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o
\
a3: ----o--o--o
Три новых коммита, в обоих случаях, являются просто копиями наборов изменений, которые происходят после коммит x
. При использовании a3
простой способ сделать эти копии - использовать hg graft
. Теперь мы можем выбрать коммит наконечника a3
, чтобы объединить его в a1
:
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o
\
a3: ----o--o--●
и результатом слияния будет коммит слияния, который будет привязан как к старому @
- новое слияние - это текущий коммит, так что теперь это @
- и ●
:
a2: o--o---------------@
/ /
A: ...--*--o--o /
\ /
a1: o--o--o--x--o--o--o /
\ /
a3: ----o--o---●
Слияние все еще использовало топологию, а не имена ветвей.
(Это ключевая реализация для Mercurial: имена ветвей просто , которые объединяет группа; , но топология графа действительно контролирует вещи.)