¿Cómo cerrar correctamente una rama de características en Mercurial?

240

He terminado de trabajar en una rama de características feature-x. Quiero fusionar los resultados de nuevo a la defaultrama y cerrarlos feature-xpara deshacerme de ellos 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

Por lo tanto, la feature-xrama (changests 40- 41) está cerrada, pero hay un nuevo encabezado , el conjunto de cambios de rama de cierre 44, que se enumerará hg headscada 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
|

Actualización : 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 alguna forma más correcta de cerrar una rama de características?

Preguntas relacionadas:

Andrey Vlasovskikh
fuente
@Andrey: pero el artículo señalado NO solo habla de "--close-branch". Muestra cuatro formas de podar su rama. Si realmente no lo quieres más, puedes clonar como se explica en el artículo. El único 'problema' es si, por alguna razón, desea cerrarlo, pero mantenerlo a mano.
Sintaxis T3rr0r
1
@WizardOfOdds Sí, he leído todo el artículo sobre la poda de ramas muertas. Quiero que la rama permanezca en el historial de revisiones, no que se descarte. Anteriormente fusioné las ramas de características defaultsin "cerrarlas". Resultó en 0 cabezas nuevas, pero tales ramas eran visibles para hg branchessiempre (como ramas inactivas).
Andrey Vlasovskikh
Para desarrollar características, tiendo a clonar todo el repositorio y luego volver a fusionarlo una vez que la característica haya terminado. No me gusta tener los restos de sucursales (cerradas) en la historia.
DanMan

Respuestas:

218

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

$ 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 características antes de fusionar 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 una confirmación auxiliar más. Se puede combinar el último compromiso real con la rama de características con este compromiso adicional utilizando --close-branch, pero se debe saber de antemano qué compromiso será el último.

Actualización : desde Mercurial 1.5 puede cerrar la rama en cualquier momento para que no aparezca en ambos hg branchesy hg headsmás. Lo único que podría molestarte es que técnicamente el gráfico de revisión todavía tendrá una revisión más sin niños.

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 esta pregunta:

Andrey Vlasovskikh
fuente
2
No es necesariamente cierto eso Bookmarks are more convenient for branching than named branches. Los marcadores de Hg no son lo mismo que las ramas de Git. Están llenos de muchos casos extremos que los hacen inadecuados como ramas de características. Por ejemplo: cuando clona un repositorio, terminará con la última confirmación en la defaultrama. Si usa marcadores, este conjunto de cambios corresponde a un marcador aleatorio (inestable). Si usa ramas con nombre, obtendrá la última confirmación en la rama estable / predeterminada, que generalmente es lo que desea. Los marcadores llegarán algún día, pero aún no están allí.
Gili
Uso marcadores como etiquetas privadas que solo son visibles en mi repositorio local. Actúan como recordatorios de los conjuntos de cambios que necesito revisar.
Gili
He intentado seguir este enfoque, pero todavía me da un error al intentar empujar: abort: push creates new remote branches:. ¿Qué podría haber hecho mal?
kasperd el
79

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

Caso 1: la rama no se fusionó con el valor predeterminado

en este caso, actualizo la rama y hago otra confirmación con --close-branch, desafortunadamente esto elige la rama para convertirse en la nueva punta y, por lo tanto, antes de enviarla a otros clones, me aseguro de que la punta real reciba algunos cambios más y otros no te confundas con ese extraño consejo.

hg up myBranch
hg commit --close-branch

Caso 2: la rama se fusionó con la predeterminada

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 el conjunto de cambios de la rama, hago otra confirmación con --close-branch y fusiono el nuevo conjunto de cambios que se convirtió en la sugerencia por defecto. la última operación crea una nueva sugerencia que está en la rama predeterminada: ¡HOORAY!

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

Espero que esto ayude a los futuros lectores.

Nachbars Lumpi
fuente
3
Buena respuesta clara para un novato de Mercurial como yo. Y gracias por no usar "ci" que no está en la lista como uno de los comandos de hg help, así que no sé lo que significa :)
MB.
8
@MB .: en tales casos, hg help cise lo explicaré.
Chris Morgan
Creo que como le dirá el comando 'hg merge', todavía hay otra confirmación al final
Chip Grandits
11

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

Todavía dejaré la respuesta aquí porque puede ayudar a otros.

Si desea deshacerse por completo de la "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, tienes 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

Entonces haces esto:

hg clone . ../cleanedrepo --rev 7

Y tendrá lo siguiente, y verá que la característica-x se ha ido:

@    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 entendido mal lo que quería, pero no modifique, me tomé el tiempo de reproducir su caso de uso:)

Sintaxis T3rr0r
fuente
7

Es extraño que nadie haya sugerido aún la forma más sólida de cerrar las ramas de una característica ... Puede combinar la confirmación de fusión con --close-branch flag (es decir, confirmar los 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. Nadie más cabeza en revgraph. Sin compromiso adicional.

tav
fuente
Lo he mencionado en mi respuesta: "" "Se puede combinar la última confirmación real a la rama de características con esta confirmación adicional usando --close-branch, pero se debe saber de antemano qué confirmación será la última". "
Andrey Vlasovskikh
OK veo. Simplemente no entiendo la última parte de la oración ("pero uno debería saber ..."), así que pensé que significa algo diferente. También me gustaría señalar que este método no es compatible con la mayoría de las herramientas GUI (TortoiseHG, SourceTree, etc.).
tav
@AndreyVlasovskikh El objetivo de esta respuesta es cerrar la rama en la fusión en lugar de en la última confirmación de la rama característica.
kasperd
@tav Antes de emitir el mergecomando, puede ser una buena idea usar hg branchpara verificar que el nombre de la rama de la fusión sea el que desea mantener abierto.
kasperd
2
En una mirada más cercana, parece que la fusión siempre estará en la rama cerrada. El resultado deseado sería que está en la rama de uno de sus padres y cierra la rama de su otro padre. Eso parece no ser posible. Entonces, después de todo, esto no parece una solución viable. Lástima, realmente quería usar una fusión como punto de cierre de una rama.
kasperd