Подтвердить что ты не робот

Найдите последнюю точку слияния двух ветвей

Имея две ветки, как я могу найти последнюю ревизию (ы), где две ветки были объединены? Есть ли стандартная команда Mercurial для этого?

Это то же самое, что вопрос Как найти общий предк двух ветвей в SVN?, но для Mercurial вместо подрывной деятельности.


Я не понимал, почему ответ Лэйзи Барджера был правильным, поэтому мне пришлось сделать небольшой рисунок, и теперь я его получаю:

При объединении двух ветвей они на самом деле не "сливаются", но изменения из одной ветки интегрируются во вторую ветвь. Это означает, что фиксация слияния принадлежит только исходной ветке, а не объединенной ветке. Вот почему ревизия слияния является одним из двух детей версии предка.

Это, вероятно, лучше всего видно с изображением:

default o----o----a---b---o---o
         \         \
other     `-o---o---m---o

ancestor(default,other) == a
children(ancestor(default,other)) == (b,m)
children(ancestor(default,other)) and merge() == m
4b9b3361

Ответ 1

hg log -r "children(ancestor(default, Cleanup)) and merge()" --template "{rev}\n"

- последнее объединение для дефолтов по умолчанию и очистки (отполированная версия ответа Тима Хенрига).

Ответ 2

В последних версиях Mercurial ( > 1.7) вы можете сделать это с помощью revsets:

hg log -r "max(ancestor(<branch1>, <branch2>))"

Тот же фильтр отсрочки также работает на панели инструментов фильтра TortoiseHg.

Ответ 3

Вы можете переписать этот запрос:

  • Самый близкий единый набор изменений, который представляет собой набор предков для верхушки обеих ветвей.

Предположим, что у вас есть две ветки, идентифицированные R1 и R2, будь то имя ветвей или номер ревизии или хэш набора изменений в каждом или что-то еще.

Затем вы можете найти набор изменений, который вы ищете, как:

hg log --rev "ancestor(R1,R2)"

Ответ 4

Если у вас более двух ветвей, вам нужно добавить дополнительный фильтр в ответ Lazy Badger, потому что children() может предоставить вам также детей, которые не находятся в ваших ветких.

hg log -r "children(ancestor(default, Cleanup)) and merge() and branch(default|Cleanup)" --template "{rev}\n"

other     o---o-----m1---o
                   /
default   o---o---a---b---o
                   \
another   o---o-----m2---o

ancestor(default, other) == a
children(ancestor(default, other)) == (m1,b,m2)
children(ancestor(default, other)) and merge() == (m1,m2)
children(ancestor(default, other)) and merge() and branch(default, other) == m1

Ответ 5

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

Правильное решение:

last(parents((ancestors('{left_branch}') and branch('{left_branch}') and merge())) and branch({right_branch}))

Ответ 6

Вы можете найти все слияния из ветки источника в ветку назначения с этим запросом на возврат:

children(p2(::DESTINATION and merge()) and branch(SOURCE)) and branch(DESTINATION)
  • ::DESTINATION and merge() получает все слияния в ветке назначения.
  • p2(set) возвращает второй родитель каждого слияния, который всегда является набором изменений в ветки источника, который был объединен с веткой назначения
  • and branch(SOURCE) фильтрует все эти слияния только с теми, которые поступают из ветки источника.
  • children(set) возвращает все дочерние элементы p2(), одним из которых является слияние, которое мы ищем
  • and branch(DESTINATION) фильтрует дочерние элементы p2(), чтобы просто показывать изменения в ветке назначения, что именно так происходит, являются слияниями, которые мы ищем.

Итак, чтобы получить последнее слияние из источника в пункт назначения, завершите указанный выше запрос с помощью запроса max(set). Итак, последняя команда:

max(children(p2(::DESTINATION and merge()) and branch(SOURCE)) and branch(DESTINATION))

Ответ 7

hg log -r "last(ancestors(target) & branch(source))"

Это дает вам наименее распространенный предок ветки источника и ветки источника ВКЛ.

source         o---a---o---m2---o
                    \      /
intermediate   o--o--m1---b---o
                               \
target         o---o------------m3---o

Наименее распространенный предок ветки источника и цели в этом примере будет b, но b не находится в ветки источника, поэтому мы хотим получить a назад.

Чтобы получить b назад, вы можете использовать решение Lasse:

hg log -r "ancestor(source, target)"

Я часто хочу знать последнюю версию "по умолчанию" в какой-либо ветке задачи, и мне все равно, что моя ветка моей задачи была напрямую объединена с дефолтом или с помощью промежуточного пути.