Ответ 1
hg log -r "children(ancestor(default, Cleanup)) and merge()" --template "{rev}\n"
- последнее объединение для дефолтов по умолчанию и очистки (отполированная версия ответа Тима Хенрига).
Имея две ветки, как я могу найти последнюю ревизию (ы), где две ветки были объединены? Есть ли стандартная команда 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
hg log -r "children(ancestor(default, Cleanup)) and merge()" --template "{rev}\n"
- последнее объединение для дефолтов по умолчанию и очистки (отполированная версия ответа Тима Хенрига).
В последних версиях Mercurial ( > 1.7) вы можете сделать это с помощью revsets:
hg log -r "max(ancestor(<branch1>, <branch2>))"
Тот же фильтр отсрочки также работает на панели инструментов фильтра TortoiseHg.
Вы можете переписать этот запрос:
Предположим, что у вас есть две ветки, идентифицированные R1
и R2
, будь то имя ветвей или номер ревизии или хэш набора изменений в каждом или что-то еще.
Затем вы можете найти набор изменений, который вы ищете, как:
hg log --rev "ancestor(R1,R2)"
Если у вас более двух ветвей, вам нужно добавить дополнительный фильтр в ответ 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
Только для потомков это неправильно в случае, если левая ветвь не была объединена с правой ветвью, но левая ветвь в последнее время была объединена вправо.
Правильное решение:
last(parents((ancestors('{left_branch}') and branch('{left_branch}') and merge())) and branch({right_branch}))
Вы можете найти все слияния из ветки источника в ветку назначения с этим запросом на возврат:
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))
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)"
Я часто хочу знать последнюю версию "по умолчанию" в какой-либо ветке задачи, и мне все равно, что моя ветка моей задачи была напрямую объединена с дефолтом или с помощью промежуточного пути.