mercurial merge tortoisehg

mercurial - Deshacer un impulso de hg(retroceso?)



merge tortoisehg (4)

Hice un gran oops, y podría necesitar algo de ayuda para deshacerlo.

Tenemos dos repositorios: un repositorio bastante estable y un repositorio en el que trabajamos los cambios. Acabo de realizar una corrección de defectos en nuestro repositorio estable y lo estaba moviendo al repositorio de trabajo. Saqué del repositorio estable, me fusioné y luego, accidentalmente, lo llevé al repositorio estable.

El repositorio estable ahora se ve así:

*merge | / | / | *b *a | | / *c

donde a es la confirmación que debería ser la punta del repositorio estable, b es todo lo que hemos hecho en el repositorio de desarrollo, y c es el punto en el que hemos ramificado el repositorio de desarrollo.

¿Cómo hago para regresar a:

*a | *c

(Sé que no puedo hacer que los cambios desaparezcan, solo estoy buscando una estructura funcional ...)

He leído algunas cosas que me hacen pensar que hg backout es el comando que necesito, pero no estoy exactamente seguro de lo que hace.


Creo que es tarde para hacer una hg rollback ya que ya has empujado tus cambios.

Puede probar con extensiones MQ, pero esto también funciona localmente. hg strip solo modificará su repositorio local. Por supuesto, podría intentar modificar el repositorio del servidor directamente en el servidor, pero si alguien lo extrajo, ya es demasiado tarde.

Otra opción se describe en el capítulo 9 de hgbook en la sección Anulación de una fusión . Implica el comando de hg backout pero podría ser un exceso para usted ...

Sugiero hg update -C a * una revisión, fusionar con tip e ignorar todos los cambios de * merge? Su repositorio se verá más o menos así que:

*second merge | / | / | / | / *merge | | / | | / | | *b | *a | / | / / *c---

Los comandos para esto son

  • $ hg --config ui.merge=internal:local merge #keep my files
  • $ hg --config ui.merge=internal:other merge #keep their files

Más detalles se pueden encontrar here .


Todos presentan una solución de pequeña a complicada a este problema, que puede ocurrirle a cualquiera de nosotros.

Lo que hice fue iniciar sesión en el escritorio remoto en mi repositorio central, y allí con la extensión mq cambié el estado de revisión a "borrador" y "stip" -ed ellos.

El único inconveniente es que si alguien tiene una copia del repositorio con las revisiones eliminadas y va a presionar, volverán a aparecer. Entonces, si puede, solicite a otros que a) hagan lo mismo (borrador, tira) b) eliminen su repositorio local y resincronicen con uno modificado

Todo se puede lograr fácilmente con TortoiseHg .


hg rollback revertirá el último commit, eliminando cualquier historial que de otro modo se hubiera realizado.

Entonces, si comienzas con esto:

*merge | / | / | *b *a | | / *c

hg rollback dará:

*a *b | / *c

tenga en cuenta que solo puede hacer una hg rollback solo una vez.

Debe realizar una copia de seguridad completa del repositorio antes de realizar la reversión. Para hacer esto, simplemente hg clone todo el repositorio.


hg rollback revierte la última transacción, por lo que se quedaría con la fusión inacabada, que tiene que usar hg update -C para salir.

Si no desea * b (lo tiene en otro clon), active la extensión MQ incorporada y ejecute hg strip -r <*b> . Deshará de * b y * fusionarse. Por defecto, guarda una copia de seguridad en caso de que cambie de opinión otra vez.

ACTUALIZACIÓN (por el comentario de @Rudi: lo siento, me perdí la parte "ya empujado")

Como la fusión ya se ha eliminado, NUNCA HAGA NUNCA lo que sugerí antes. Los correos electrónicos de odio de otros desarrolladores hubieran sido el mejor resultado.

Haz esto en su lugar:

hg up -r<*merge> hg revert -r<*a> -a hg ci -m "undo unintended merge"

O podrías ser más kosher:

hg up -r<*merge> hg backout -r<*merge> --parent<*a>