¿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?

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.


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 .

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.


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!


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.