2010-02-10 15 views
233

He terminado de trabajar en una rama de función feature-x. Quiero fusionar los resultados a la rama default y cerrar feature-x para deshacerme de ella en la salida de hg branches.¿Cómo cerrar correctamente una rama de función en Mercurial?

me ocurrió con 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í las feature-x rama (changests 40 - 41) está cerrado, pero hay una nueva cabeza, la rama de cierre 44 conjunto de cambios, que se enumeran en hg heads cada vez que:

$ 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 encabezados de ramas cerradas en la salida 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:

+0

@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 quieres cerrarlo, pero mantenlo. – SyntaxT3rr0r

+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 revisión, no para descartarla. Previamente, simplemente fusioné ramas de características en 'default' sin" cerrarlas ". Resultó en 0 nuevas cabezas, pero tales ramas eran visibles en 'hg branches' para siempre (como ramas inactivas). –

+0

Para desarrollar funciones, tiendo a clonar todo el repositorio y luego fusionarlo de nuevo una vez que la función ha finalizado. No me gusta tener los restos de ramas (cerradas) en la historia. – DanMan

Respuesta

211

Una forma es simplemente dejar ramas de características combinadas abierta (e inactivos):

$ 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 para cerrar una rama de la característica antes de la fusión usando un extra de cometer:

$ 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 de ellos es más sencillo, pero deja abierta una rama. El segundo no deja cabezas/ramas abiertas, pero requiere una confirmación adicional.Uno puede combinar la última confirmación real con la rama de características con este compromiso extra usando --close-branch, pero uno debe saber de antemano qué compromiso será el último.

actualización: Desde Mercurial 1.5 se puede cerrar la rama en cualquier momento por lo que no aparecerá tanto en hg branches y hg heads más. Lo único que podría molestarte es que técnicamente el gráfico de revisión tendrá una revisión más sin childen.

Update 2: Desde mercuriales 1,8 marcadores se han convertido en una característica central de Mercurial. Los marcadores son más convenientes para la bifurcación que las sucursales con nombre. Véase también esta pregunta:

+1

No es necesariamente cierto que 'Marcadores son más convenientes para la bifurcación que las ramas nombradas'. 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 características. Por ejemplo: cuando clonas un repositorio, terminarás con la última confirmación en la rama 'predeterminada'. 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 allí algún día, pero aún no están allí. – Gili

+0

Uso marcadores como etiquetas privadas que solo están visibles en mi repositorio local. Actúan como recordatorios de los conjuntos de cambios que necesito volver a visitar. – Gili

+0

Intenté seguir este enfoque, pero aún recibo un error al intentar presionar: 'abortar: el botón crear nuevas ramas remotas:'. ¿Qué podría haber hecho mal? – kasperd

11

EDIT ay, demasiado tarde ... Yo sé leer su comentario indicando que desea mantener la función de x conjunto de cambios alrededor, por lo que la el enfoque de clonación aquí no funciona.

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

Si quiere deshacerse completamente 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 sobre los jefes.

Por lo que yo entiendo que usted tiene esto y quiere deshacerse de la "característica-x" cabeza 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 

Por lo que hace esto:

hg clone . ../cleanedrepo --rev 7 

Y que tendrá la siguiente, y verá que la función x-es, en efecto 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 

que puede haber entendido mal lo que quería, pero por favor no mod abajo, me tomé el tiempo que reproduce su caso de uso:)

+0

Sí, no quiero borrar el historial. Gracias de todos modos. –

76

en mi humilde opinión hay dos casos de ramas que se olvidó de cerrar

Caso 1: rama no fue combinado en forma predeterminada

en este caso de que actualice a la rama y haga otra confirmación con --close-branch, desafortunadamente esto elige que la rama se convierta en la nueva sugerencia y, por tanto, antes de empujarla a otros clones, me aseguro de que la verdadera consejo recibe algunos cambios más y otros no se confunden con ese consejo extraño.

hg up myBranch 
hg commit --close-branch 

Caso 2: rama se fusionó en default

Este caso no es muy diferente del caso 1 y puede ser resuelto mediante la reproducción de los pasos para el caso 1 y dos adicionales.

en este caso actualizo al conjunto de cambios de la rama, realizo 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.

+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 :) –

+7

@MB .: en tales casos, 'hg help ci' le explicará a usted. –

6

Es extraño, que todavía nadie ha sugerido la forma más robusta de cerrar unas ramas de características ... Usted puede simplemente combinar de combinación de comprometerse con la bandera --close-rama (es decir commit modificado archivos y cerrar el rama al mismo tiempo):

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

Así que, eso es todo. Nadie más cabeza en revgraph. Sin compromiso adicional.

+0

Lo mencioné en mi respuesta: "" "Uno puede combinar la última confirmación real con la rama de características con este compromiso adicional usando --close-branch, pero uno debe saber con anticipación qué compromiso será el último". "" –

+0

Ok, ya veo. Simplemente no entiendo la última parte de la oración ("pero uno debería saber ..."), así que pensé que significaba 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

+0

@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 de características. – kasperd

Cuestiones relacionadas