2010-06-30 10 views
12

Tenemos un escenario en el que sin intención unimos una rama con nombre (ABC) en nuestra sucursal default.Mercurial Deshacer fusionar

hg rollback no es una opción porque ha habido un par de compromisos desde entonces.

¿Hay alguna manera de deshacer esto?

Respuesta

4

Si no ha publicar el repositorio público puede hacerlo

hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new 

y eliminar el viejo repo.

+0

Esto funciona ... ¡gracias! Ahora tengo un problema restante: ¿cómo obtener los conjuntos de cambios aplicados después de la combinación incorrecta en mi repositorio recién clonado? –

+0

@Steve Vea mi respuesta. Tendrás que "volver a establecer la base" en la cabeza anterior. – tghw

+0

retroceso no se puede deshacer una fusión. – tghw

8

Necesitará la extensión Mq. Si no lo tiene activado, hágalo agregando esto a su archivo Mercurial.ini o .hgrc.

[extensions] 
hgext.mq= 

Si no está familiarizado con él, la historia se manipula el Mq extension de let. La buena noticia es que esto nos permitirá arreglar su repositorio. La mala noticia es que cualquiera que tenga un clon del informe defectuoso tendrá que volver a clonarlo, porque cambiaremos la historia.

Primero, vaya a hacer otro clon de su repositorio para trabajar, para no ensuciar nada.

Ahora, busque la id de revisión del conjunto de cambios de combinación (que fusionó default y su rama con nombre). Escríbelo. Nos referiremos a él como changesetM. Ahora encuentra la id de revisión del próximo conjunto de cambios. Escríbelo. Nos referiremos a él como changesetN.

Una vez que tenga estos dos identificadores de revisión, diríjase a su línea de comandos y cd en su repositorio. A continuación, escriba el siguiente, en sustitución de changeset[M|N] con el identificador de revisión adecuada .:

$ hg qimport -r changesetN:tip 
    # This will add all of your changes since the merge to the queue 
$ hg qpop -a 
    # This pops them all out of your history. 
$ hg strip changesetM 
    # This removes the merge changeset. 
$ hg update -C default 
    # Make sure we're on the default branch 
$ hg qpush -a 
    # Take the changesets in the queue and push them back onto your history. 
$ hg qfinish -a 
    # Remove changesets from the queue and finalize them as normal changesets. 

Esencialmente, usted está rebasado los nuevos conjuntos de cambios en la parte superior de la rama por defecto, retirar el conjunto de cambios de combinación en el proceso. Una vez que haya terminado, deberá enviar los cambios a un nuevo repositorio en el servidor y hacer que sus colegas clonen copias recientes.

Por último, si tiene alguna otra pregunta sobre Mercurial, también consulte kiln.stackexchange.com.

ACTUALIZACIÓN

me olvidó mencionar: Si alguien se ha basado en los cambios en algo que era sólo en la otra rama, es posible que hg qpush -a se producirá un error. Verá un archivo foo.txt.rej y foo.txt.orig por ahí. Lamentablemente, tendrás que arreglarlo tú mismo. Para solucionarlo, abra el archivo original, el archivo .orig y el archivo .rej y elija los cambios correctos para fusionarlos, guardándolos en el archivo original. Una vez que lo haya combinado, use hg qrefresh para actualizar ese parche en el nuevo parche combinado. De ellos, debería poder ejecutar hg qpush -a nuevamente y continuar. Si vuelve a encontrarse con el mismo error en otro parche, simplemente siga el mismo proceso.

+0

Estoy contigo hasta que hg qpush -a. Me sale el siguiente en la consola: aplicar xxx.diff archivo de parches ----- Hunk # 1 falló en 806 1 de 1 trozos FALLO - ahorro de rechazos "..." parche ha fallado, no a continúe ... errores durante la aplicación, por favor, corrija y actualice 310.diff –

+0

Consulte la sección actualizada en mi respuesta. – tghw

+0

Esto destruye la historia, por lo que no funcionará si el error se ha propagado. Ver: http://stackoverflow.com/questions/265944/backing-out-a-backwards-merge-on-mercurial –

3

me encontré con el siguiente escenario hoy:

@ changeset: 1728:5d703e1051d3 
|\ parent:  1727:1a5f73b5edb4 
| | parent:  1720:65ddd0bde225 
| | user:  nn 
| | date:  Wed Feb 27 10:35:00 2013 +0100 
| | summary:  Merge with SomeBranch 
| | 
| o changeset: 1727:1a5f73b5edb4 
| | user:  nn 
| | date:  Wed Feb 27 10:34:30 2013 +0100 
| | summary:  lorem ipsum 
| | 
[some more changesets] 
| | 
o | changeset: 1720:65ddd0bde225 
| | branch:  SomeBranch 
| | user:  nn 
| | date:  Wed Feb 27 07:44:46 2013 +0100 
| | summary:  lorem ipsum 

Dónde SomeBranch no debería haberse fusionado en por defecto. Lo que hicimos para resolver esto, era utilizar el comando backout con la opción parent así:

hg backout --rev=1728 --parent=1727 

Por esto no deshacer la fusión en sí: En cuanto a una rama gráfica (ya sea con registro gráfico o en TortoiseHg) aún verá SomeBranch entrando en por defecto en r1728. El resultado de la fusión sin embargo se deshace, lo que significa que el conjunto de cambios que contiene el retroceso (r1729 en mi caso) es idéntico a r1727.

+0

¿Esto también se ocupa de las banderas de combinación? – elzapp

Cuestiones relacionadas