2010-02-08 16 views
52

Quiero mover un conjunto de cambios de una rama a otra. Básicamente, tengo actualmente:Cómo mover un conjunto de cambios a una nueva rama en mercurial

A -> B -> C -> D # default branch 

Y quiero:

A # default branch 
\-> B -> C -> D # some_new_branch 

Dónde some_new_branch no existe todavía. Estoy acostumbrado a hacer git, así que creo que me falta una simple manera "mercurial".

+2

Probablemente depende de lo que quiere decir con "rama". Mercurial tiene muchas estrategias de ramificación diferentes, con las que debe familiarizarse: http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ – user37078

+1

Pregunta similar: [Cambios de movimiento de Mercurial a una nueva rama] (http://stackoverflow.com/q/4665549) –

+1

Posible duplicado de [Cambios de movimiento de mercurio en una nueva sucursal] (http://stackoverflow.com/questions/4665549/mercurial-move-changes- to-a-new-branch) – PhoneixS

Respuesta

67

Una forma es exportar un parche para B, C, D; actualizar a A; rama; aplicar el parche:

hg export -o patch B C D 
hg update A 
hg branch branchname 
hg import patch 

Para retirar B, C, D de la rama por omisión, utilice el mando de la extensión mq strip.

+0

En un proyecto, decidimos no incluir una función en la próxima versión, que ya formaba parte de la rama predeterminada: utilicé su solución para crear una nueva rama con los conjuntos de cambios relacionados con esta función. En lugar de eliminar los conjuntos de cambios, revertí la rama predeterminada al estado antes de que comenzara la implementación. –

+0

Esto es para antes de que se hayan presionado a los valores predeterminados, supongo? – NoBugs

+0

Sí, cualquier edición de la historia es demasiado tarde si se comparte el historial original. Tendría que editar todas las copias del historial, lo que puede no ser práctico o posible. –

7

Con Mercurial cola:

# mark revisions as draft in case they were already shared 
#hg phase --draft --force B:D 
# make changesets a patch queue commits 
# (patches are stored .hg/patches) 
hg qimport -r B:D 
# pop changesets from current branch 
hg qpop -a 
# 
hg branch some_new_branch 
# push changesets to new branch 
hg qpush -a 
# and make them commits 
hg qfinish -a 

Sin comentarios:

hg qimport -r B:D 
hg qpop -a 
hg branch some_new_branch 
hg qpush -a 
hg qfinish -a 
+1

En la 4ª línea, el comando es hg qpush -a – Shad

+1

@Shad gracias, corregido. –

+0

Aún necesita quitar conjuntos de cambios movidos, si, por ejemplo, se publicaron en Bitbucket (en su interfaz web en "Configuración" -> "Conjuntos de cambios de franja"). En otro caso, vendrán en una rama, se movieron, después del primer tirón. –

4

alternativa al trasplante o parche, se podrían utilizar graft.

hg update A 
hg branch branchname 
hg graft -D "B:D" 
hg strip B 

Tenga en cuenta que cambiar la historia es una mala práctica. Deberías desnudarte solo si aún no has empujado. De lo contrario, aún podría anular sus cambios.

+0

Esto es simple e impresionante e incluso puede hacerse fácilmente usando GUI como TortoiseHg. – jahu

Cuestiones relacionadas