¿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:
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:
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.
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:)
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.
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