mercurial branch

¿Cómo se encuentra el padre de una sucursal mercurial nombrada?



branch (5)

Basado en la respuesta de @ krupan, se me ocurrió lo siguiente:

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

Esto imprimirá solo el nombre de la rama principal.

  • --rev "revset expression" especifica un revset usando una expresión de revset.
  • branch() selecciona todas las revisiones de la rama especificada.
  • min() selecciona la primera revisión del rango de revisión especificado.
  • parents() selecciona los padres del rango de revisión especificado.
  • . indica la revisión actual. Alternativamente, puede especificar cualquier revisión por nombre.
  • --template "{branch}/n" especifica una plantilla personalizada que solo imprime el nombre de la rama.

En algún punto en el tiempo, tienes una rama llamada mercurial, vamos a llamarla, por defecto, y creas una rama con nombre por defecto, vamos a llamarlo, foo, y haces algunos commits en foo. Ese trabajo se ve así:

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

Mientras tanto, otros están haciendo commits en default. Ahora se le dice a alguien más que haga un trabajo en foo y quiere ver si y qué podría necesitar fusionarse con la sucursal principal de foo. Si supieran que foo venía de default podrían simplemente ejecutar:

hg merge --preview default

pero no saben de dónde vino foo. Podrían correr:

hg glog

o disparar a tortoisehg y rastrear la línea de regreso al padre de foo, pero ¿hay algún comando que puedan ejecutar que simplemente les diga la rama padre de foo?


Gracias por los ejemplos de revset. Jugueteé y encontré esta solución que me gusta:

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

que imprimirá la revisión en la que se basó el primer commit en la rama foo. Puedes buscar la rama (o la falta de ella que indique la rama predeterminada) en ese conjunto de cambios y esa es la rama padre de foo (al menos, la forma en que se define la rama principal en la pregunta).

Pero tengo esta sensación molesta ... los padres () podrían devolver más de un conjunto de cambios. ¿Podría el primer compromiso en una rama tener dos padres? No puedo pensar en cómo podría suceder eso.


Puede utilizar los cambios para encontrar esta información, siempre que esté utilizando Mercurial v1.6.0 o posterior. Por ejemplo:

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

esto imprimirá una única revisión, el "punto de ramificación" de su rama de características.


Suponiendo que tiene Mercurial v1.7 o posterior, esto se puede hacer con un revset.

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

donde changeset puede ser una rama, etiqueta, id de revisión o hash de conjunto de cambios.

Esto imprimirá el mayor ancestro común de los dos conjuntos de cambios.

Si no hay un ancestro común, entonces el resultado está vacío.


para mí también funcionó:

hg log --only-branch $(hg branch) | tail -n 10 | grep parent