¿Cómo abandonar una fusión hg?

131

Soy nuevo en colaborar con Mercurial. Mi situación:

  • Otro programador cambió la rev 1 de un archivo para reemplazar las sangrías de 4 espacios con sangría de 2 espacios. (Es decir, cambió cada línea.) Llame a esa rev 2, empujada al repositorio remoto.
  • He cometido cambios sustanciales rev 1 con varios cambios de código en mi espacio de trabajo local. Llame a eso rev 3.
  • He hg pulled hg mergeyd sin una idea clara de lo que estaba pasando.
  • Los conflictos son innumerables y no son realmente sustantivos.

Así que realmente desearía haber cambiado mi repositorio local a sangrías de 2 espacios antes de fusionar; entonces la fusión será trivial (supongo). Pero parece que no puedo dar marcha atrás. Creo que necesito hg update -r 3pero dice abort: outstanding uncommitted merges.

¿Cómo puedo deshacer la fusión, cambiar el espacio en mi repositorio local y volver a fusionar?

Grumdrig
fuente

Respuestas:

126

Puede descartar los cambios no confirmados con el indicador -C (o --clean):

hg update -C -r 3

CUIDADO: ¡Todo lo que no se haya comprometido desaparecerá!

Después de eso, probablemente debería usar algún tipo de herramienta de formateador de código para hacer toda la operación, o al menos algunas buscar y reemplazar con expresiones regulares. Algo tan simple como reemplazar lo que coincide ^____(use 4 espacios en lugar de guiones bajos) con __(2 espacios), repetido varias veces (a menos que tenga un código anidado increíble) debería funcionar.

R. Martinho Fernandes
fuente
Oh gracias. Debes haber respondido bien cuando lo descubrí yo mismo. Estoy en emacs, al M-x indent-regionigual que el truco reindent.
Grumdrig el
66
Vale la pena señalar que los archivos no rastreados no se eliminarán.
djsutho
132

Por cierto: si simplemente revierte la fusión que hiciste y 3 no es tu número de revisión, puedes hacer esto:

hg update -C -r .
matemáticas
fuente
24
Para cualquiera como yo que al principio no entendía cómo funciona esto: el punto .es un acceso directo a la revisión anterior.
Jeroen Wiert Pluimers
1
¡gran respuesta! debería ser mejor
Oleg Abrazhaev
1
@Thymine: De lo hg help updateque obtengo: si no se especifica ningún conjunto de cambios, actualice a la punta de la rama con nombre actual ... y la punta no siempre es su revisión actual en la que está trabajando. No lo probé, hasta ahora ..
matemáticas
1
Ah, es un buen detalle para saber ... en realidad voy a eliminar mi comentario alegando que dejarlo -r .es lo mismo
Thymine
Simple y muy útil.
Naveen Kumar V
33

Para deshacer una fusión no comprometida, use

hg update --clean

que verificará una copia limpia de la combinación original original, perdiendo todos los cambios.

Tao
fuente
2

Aparentemente solo necesitaba hacerlo hg update -C -r 3, lo que sobrescribe mis archivos locales con la revolución en mente (que es lo que pensé hg updateque haría, pero estaba equivocado). ¡Gracias por mi ayuda!

Grumdrig
fuente
2
Agregando -Co --cleanes cómo le dice a Mercurial que siga adelante, incluso cuando arroje algunos archivos modificados. Tienes razón, eso hg update -r Xnormalmente te llevará a la revisión X, pero cuando estás en una fusión debes insistir un poco más :-)
Martin Geisler
77
Creo que "hg revert --all --cancelmerge" sería mucho más intuitivo.
Warren P