Найти последнюю точку слияния двух ветвей - PullRequest
23 голосов
/ 09 ноября 2011

Имея две ветви, как я могу найти последние ревизии, в которых две ветви были объединены?Существует ли стандартная команда Mercurial для этого?

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

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

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

Это, вероятно, лучше всего видно на рисунке:

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

Ответы [ 7 ]

19 голосов
/ 09 ноября 2011
hg log -r "children(ancestor(default, Cleanup)) and merge()" --template "{rev}\n"

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

4 голосов
/ 09 ноября 2011

Вы можете переписать этот запрос следующим образом:

  • Ближайший единственный набор изменений, который является набором изменений предка кончика обеих ветвей

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

Тогда вы можете найти искомый набор изменений как:

hg log --rev "ancestor(R1,R2)"
4 голосов
/ 09 ноября 2011

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

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

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

3 голосов
/ 08 апреля 2013

Если у вас более двух веток, вам нужно добавить дополнительный фильтр к ответу Ленивого барсука, потому что 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
1 голос
/ 02 июля 2014

Вы можете найти все слияния из исходной ветви в ветку назначения с помощью этого запроса revset:

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))
1 голос
/ 22 ноября 2012

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

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

last(parents((ancestors('{left_branch}') and branch('{left_branch}') and merge())) and branch({right_branch}))
0 голосов
/ 05 января 2018
hg log -r "last(ancestors(target) & branch(source))"

Это дает вам наименее общего предка из target и source branch ON source branch.

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

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

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

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

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

...