Как вы находите родителя названной ртутной ветви? - PullRequest
34 голосов
/ 31 марта 2011

В какой-то момент у вас есть mercurial по имени ветвь, давайте назовем его по умолчанию, и вы создадите именованную ветку по умолчанию, давайте назовем ее foo, и вы сделаете некоторые коммиты на foo. Эта работа выглядит примерно так:

hg update default
hg branch foo
hg commit -m "created branch foo"
# work, work
hg commit
# work work
hg commit

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

hg merge --preview default

но они не знают, откуда взялся Фу. Они могли бежать:

hg glog

или запустить tortoisehg и отследить строку до родителя foo, но есть ли команда, которую они могли бы выполнить, которая просто сообщит им родительскую ветку foo?

Ответы [ 4 ]

51 голосов
/ 01 апреля 2011

Спасибо за примеры revset.Я поиграл и нашел это решение, которое мне нравится:

hg log -r "parents(min(branch(foo)))"

, которое напечатает ревизию, на которой был основан первый коммит в ветви foo.Вы можете искать ветку (или ее отсутствие, указывающую ветку по умолчанию) в этом наборе изменений, и это родительская ветка foo (по крайней мере, способ определения родительской ветки в вопросе).

Но у меня есть этонеприятное чувство ... родители () могут вернуть более одного набора изменений.Может ли первый коммит на ветке иметь двух родителей?Я не могу думать о том, как это могло произойти.

8 голосов
/ 01 апреля 2011

Вы можете использовать revsets для поиска этой информации, при условии, что вы используете Mercurial v1.6.0 или новее.Например:

hg update BRANCH
hg log -r "max(ancestors(BRANCH) and not branch(BRANCH))"

это распечатает одну ревизию, «точку ветвления» вашей ветви функций.

4 голосов
/ 01 апреля 2011

Если у вас Mercurial v1.7 или новее, это можно сделать с помощью revset.

hg log -r "ancestor(<changeset>, <changeset>)"

, где changeset может быть ветвью, тегом, идентификатором ревизии илихэш набора изменений.

Это выведет наибольший общий предок из двух наборов изменений.

Если общего предка нет, то результат будет пустым.

3 голосов
/ 24 мая 2017

Основываясь на ответе @ krupan, я придумал следующее:

hg log --rev "parents(min(branch(.)))" --template "{branch}\n"

Это напечатает только имя родительской ветви.

  • --rev "revset expression" указывает revset с использованием выражения revset.
  • branch() выбирает все ревизии указанной ветви.
  • min() выбирает первую ревизию указанного диапазона ревизии.
  • parents() выбирает родителей указанного диапазона редакций.
  • . указывает текущую редакцию.В качестве альтернативы вы можете указать любую ревизию по имени.
  • --template "{branch}\n" указывает пользовательский шаблон, который печатает только имя ветви.
...