2010-12-07 22 views

Respuesta

199

Actualiza a la rama stiging y crea una nueva bifurcación. Luego cierra la vieja rama.

En resumen:

hg update stiging 
hg branch staging 
hg commit -m"Changing stiging branch to staging." 
hg update stiging 
hg commit --close-branch -m"This was a typo; use staging instead." 
hg push --new-branch 
+1

Esta es la mejor manera de hacer esto que he encontrado. Cerrar la rama evita que otros la utilicen accidentalmente porque no aparece en la salida de "hg branches". Todavía le permite acceder más tarde si conoce el nombre. – Utensil

+2

¿Mercurial permitirá reutilizar el nombre de una rama cerrada? Es decir, si tiene una rama v3, ¿puede utilizar la técnica anterior para cambiarle el nombre a v4 y luego bifurcar una rama _new_ v3 a pesar de haber dejado atrás una v3 cerrada? –

+1

No, las ramas son permanentes.Si se compromete con una sucursal cerrada, Mercurial la reabrirá. Si desea ramas "livianas" (como las de git), use marcadores en su lugar. –

13

Hacer una nueva rama llamada "puesta en escena" y olvidarse de la otra ...

+0

+1 eso es lo que haría. Los viejos conjuntos de cambios seguirán teniendo el antiguo nombre de la rama, pero los nuevos tendrán el nuevo nombre de la rama. – barjak

16

Si tiene conjuntos de cambios en él, entonces usted tendrá que utilizar el convert extension con un branchmap para cambiar su nombre. Todo el mundo tendrá que clonar el nuevo repositorio o quitar la vieja rama.

+1

Esta es una solución interesante, ¿puedes elaborar un poco más? – DrM

+0

@DrM: ver http://mercurial.selenic.com/wiki/ConvertExtension#A--branchmap – Gili

54

Para los futuros lectores: Con la extensión rebase, se puede hacer una nueva rama con el mismo padre que stiging y mover toda la historia de la rama a la misma, así:

hg update -r "parents(min(branch('stiging')))" 
hg branch staging 
hg commit 
hg rebase --source "min(branch('stiging'))" --dest staging 

Esto supone que stiging tiene solo un padre. Por supuesto, puedes usar números de revisión explícitos en su lugar.

Nota 1: Si la rama stiging incluye fusiones con otras ramas, yo creo que esto preservarlos, siempre y cuando staging y stiging tienen el mismo padre. Pero ciertamente lo verificaría dos veces.

Nota 2: Dado que esto edita el historial, la antigua rama no desaparecerá simplemente de los repositorios clonados (consulte la documentación rebase). A menos que todos puedan clonar de nuevo, puede que no sea una solución muy práctica para un grupo grande.

Note3/Edit (cortesía de @JasonRCoombs): Ahora que phases son estándar en mercurial, rebase se rehusará a modificar los conjuntos de cambios que ya se han insertado. Puede engañar cambiando la fase a borrador (con hg phases), o deje que la rama antigua permanezca donde está, y simplemente haga una copia con el nombre adecuado (por ejemplo, con `hg rebase --keep ').

+0

+1 para equipos pequeños en los que puede forzar a los usuarios a clonar esta es una buena idea, o use' hg convert' en su lugar. – hochl

+5

Con las últimas versiones de Mercurial, el comando rebase fallará con "can not rebase changesets inmutables" si los cambios que se van a mover son "públicos". O oblígalos a que sean borradores (con hg phases) o pasen '--keep' al comando rebase, que copiará en lugar de mover los cambios. –

+0

En el paso 4: 'abortar: no se puede volver a establecer el conjunto de cambios inmutables 11b1e2b7dc4f'. Tenga en cuenta que he injertado changesets de otra rama en esta. Además de eso, está dividido y se fusiona gratis. –

2

Esto modifica el historial y es solo para usuarios avanzados de Mercurial. No hagas esto si no sabes lo que eso significa.

Si el stiging es solo local, puede cambiarlo por una combinación de graft y strip. Comience por actualizar al conjunto de cambios antecesor donde divergió el stiging. Crea la rama de etapas e injerta cada confirmación desde stiging a staging. La estadificación debería ser ahora una copia de stiging. Por último, destruye el stiging eliminando su primer commit.

hg update {SHA-1 of the ancestor changeset} 
hg branch staging 
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head} 
hg strip {first changeset in stiging} 
hg push --new-branch 
Cuestiones relacionadas