Как объединить ветку с другой ветвью того же родителя, но исключить одну только ревизию в Mercurial - PullRequest
0 голосов
/ 06 января 2019

У меня есть ветвь a1, родительская ветвь которой A. Теперь я создал другую ветвь a2 от того же родительского A. Я хочу объединить a1 с a2, исключая chengeset из a1. Есть ли способ частично объединить ветку, исключая ревизию?

1 Ответ

0 голосов
/ 07 января 2019

Короткий ответ - нет: объединяет работу в соответствии с топологией графа, а не с именами ветвей.

Более длинного ответа все еще нет, но стоит нарисовать топологию. Ваше описание говорит о происхождении ветви, но сами ветви не имеют отношений родитель / потомок. Ветви - это просто наборы коммитов, каждый из которых содержит имя ветки. ( У коммитов есть родитель / потомок или, в более общем смысле, отношения предок / потомок.) Итак:

У меня есть ветвь 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: имена ветвей просто , которые объединяет группа; , но топология графа действительно контролирует вещи.)

...