¿Cómo cerrar correctamente una rama de entidad en Mercurial?


He terminado de trabajar en una rama de características feature-x. Quiero combinar los resultados de vuelta a la rama default y cerrar feature-x para deshacerme de ella en la salida de hg branches.

Se me ocurrió el siguiente escenario, pero tiene algunos problemas:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

Así que la rama feature-x (changests 40-41) está cerrado, pero hay una nueva cabeza , el conjunto de cambios de la rama de cierre 44, que se listará en hg heads cada vez:

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

Update: Parece que desde la versión 1.5 Mercurial ya no muestra cabezas de ramas cerradas en la salida de hg heads.

¿Es posible cerrar una rama fusionada sin dejar una cabeza más? ¿Hay una forma más correcta de cerrar una rama de característica?

Preguntas relacionadas:

Author: Community, 2010-02-10

4 answers

Una forma es dejar abiertas (e inactivas) las ramas de entidades fusionadas:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

Otra forma es cerrar una rama de entidad antes de fusionarla usando una confirmación adicional:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

El primero es más simple, pero deja una rama abierta. El segundo no deja cabezas/ramas abiertas, pero requiere un commit auxiliar más. Uno puede combinar el último commit real a la rama feature con este commit extra usando --close-branch, pero uno debe saber de antemano qué commit será el último una.

Actualización : Desde Mercurial 1.5 puede cerrar la rama en cualquier momento para que ya no aparezca en hg branches y hg heads. Lo único que podría molestarle es que técnicamente el gráfico de revisiones todavía tendrá una revisión más sin childen.

Actualización 2 : Desde Mercurial 1.8 los marcadores se han convertido en una característica central de Mercurial. Los marcadores son más convenientes para ramificar que las ramas con nombre. Ver también esto pregunta:

 215
Author: Andrey Vlasovskikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:44

En mi Humilde opinión hay dos casos para ramas que se olvidaron de cerrar

Caso 1: branch no se fusionó en default

En este caso actualizo a la rama y hago otro commit con close close-branch, desafortunadamente esto elige la rama para convertirse en la nueva punta y por lo tanto antes de empujarla a otros clones me aseguro de que la punta real reciba algunos cambios más y otros no se confundan sobre esa punta extraña.

hg up myBranch
hg commit --close-branch

Caso 2: rama se fusionó en por defecto

Este caso no es muy diferente del caso 1 y se puede resolver reproduciendo los pasos para el caso 1 y dos adicionales.

En este caso actualizo al conjunto de cambios de la rama, hago otro commit con close close-branch y fusiono el nuevo conjunto de cambios que se convirtió en el tip por defecto. la última operación crea una nueva punta que está en la rama predeterminada - ¡HURRA!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

Espero que esto ayude a los futuros lectores.

 77
Author: Nachbars Lumpi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-01 23:23:17

EDITAR ¡ay!, demasiado tarde... Sé que leí su comentario indicando que desea mantener el conjunto de cambios feature-x, por lo que el enfoque de clonación aquí no funciona.

Todavía dejaré que la respuesta aquí pueda ayudar a otros.

Si desea deshacerse por completo de "característica X", porque, por ejemplo, no funcionó, puede clonar. Este es uno de los métodos explicados en el artículo y funciona, y habla específicamente de cabezas.

Por lo que yo entiendo ten esto y quieres deshacerte de la cabeza" feature-x " de una vez por todas:

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Así que haces esto:

hg clone . ../cleanedrepo --rev 7

Y tendrás lo siguiente, y verás que feature-x ha desaparecido:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Puede que haya malinterpretado lo que quería, pero por favor no mod hacia abajo, me tomé el tiempo de reproducir su caso de uso:)

 11
Author: SyntaxT3rr0r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-10 18:13:30

Es extraño, que nadie ha sugerido todavía la forma más robusta de cerrar una rama característica... Puedes simplemente combinar fusionar commit con flag close-branch flag (es decir, confirmar archivos modificados y cerrar la rama simultáneamente):

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

Entonces, eso es todo. No hay una cabeza extra en revgraph. No hay compromiso extra.

 7
Author: tav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-06 22:19:08