Mercurial deshacer la última confirmación

125

¿Cómo puedo deshacer mi último cambio cometido accidentalmente (no presionado) en Mercurial?

Si es posible, se preferiría una forma de hacerlo con TortoiseHg.

Actualizar

En mi caso concreto, cometí un conjunto de cambios (no presionado). Luego saqué y actualicé desde el servidor. Con estas nuevas actualizaciones decidí que mi último commit está obsoleto y no quiero sincronizarlo. Entonces, parece que eso hg rollbackno es exactamente lo que estoy buscando, porque revertiría el pull en lugar de mi commit.

Martin Buberl
fuente
1
¿Qué hay de hacer dos hg rollbacky luego tirar de nuevo?
VonC
1
La primera reversión deshace el tirón, la segunda reversión me dice "no hay información de reversión disponible".
Martin Buberl
1
Me he encontrado con la misma situación, y hasta donde sé, una vez que hayas realizado cualquier otra operación, no puedes retroceder o eliminarla del historial. Tendría que volver a clonar el repositorio hg.
3
strip --keep: stackoverflow.com/questions/29413851/… resuelve directamente la tarea, al igual que MQ qimport. Alternativamente, puede ser mejor simplemente rebaseen el escenario si los cambios locales también se mantienen y no hay conflicto. (Use una combinación para mantener algunos cambios combinados de ambas ramas cuando ese es el objetivo final del gráfico deseado, especialmente en un caso no rápido). También puede ser válido solo para cerrar la rama, que todavía 'conserva el historial' (pero diferente a una fusión) dependiendo del estado final deseado.
usuario2864740
2
Como @ user2864740 dice, hg strip --keepes el comando de hacer uso, pero es necesario proporcionar una revisión, por ejemplo: hg strip --keep -r .. Esta respuesta explica bien stackoverflow.com/a/19064016/1286571
ForeverWintr

Respuestas:

77

Una forma sería hg rollback (en desuso a partir de Hg2.7, agosto de 2013)

Utilice en hg commit --amendlugar de rollbackcorregir errores en la última confirmación.

Revierta la última transacción en un repositorio.

Al confirmar o fusionar , Mercurial agrega la entrada del conjunto de cambios en último lugar.
Mercurial mantiene un registro de transacciones del nombre de cada archivo tocado y su longitud antes de la transacción. Al abortar, trunca cada archivo a su longitud anterior. Esta simplicidad es uno de los beneficios de hacer que los revlogs solo se agreguen . El diario de transacciones también permite una operación de deshacer.

Vea la sección de recuperación de TortoiseHg :

texto alternativo

Este hilo también detalla la diferencia entre hg rollbacky hg strip:
(escrito por Martin Geisler, quien también contribuye en SO)

  • ' hg rollback' eliminará la última transacción. Las transacciones son un concepto que a menudo se encuentra en las bases de datos. En Mercurial comenzamos una transacción cuando se ejecutan ciertas operaciones, como commit, push, pull ...
    Cuando la operación finaliza con éxito, la transacción se marca como completada. Si se produce un error, la transacción se "revierte" y el repositorio se deja en el mismo estado que antes.
    Puede activar manualmente una reversión con 'hg rollback'. Esto deshacerá el último comando transaccional. Si un comando de extracción trajo 10 nuevos conjuntos de cambios al repositorio en diferentes ramas, entonces ' hg rollback' los eliminará a todos. Tenga en cuenta: ¡no hay respaldo cuando revierte una transacción!

  • ' hg strip' eliminará un conjunto de cambios y todos sus descendientes. Los conjuntos de cambios se guardan como un paquete, que puede volver a aplicar si los necesita.

ForeverWintr sugiere en los comentarios (en 2016, 5 años después)

Puede 'deshacer' los archivos olvidándolos primero, por ejemplo: hg forget filea; hg commit --amendpero eso parece poco intuitivo.
hg strip --keepes probablemente una mejor solución para hg moderno.

VonC
fuente
Cuando entiendo que correcto, la reversión elimina la última transacción. En mi caso hice una confirmación, luego me retiré del servidor. Entonces, ¿eso significa que haría retroceder el tirón en lugar de confirmar?
Martin Buberl
1
@ Martin Buberl: Según selenic.com/mercurial/hg.1.html#rollback , la extracción se considera una transacción. Entonces, si tira, la ejecución hg rollbackdeshacerá el tiro en lugar de la confirmación.
Tim Henigan el
2
No estoy seguro de cómo hg commit --amendse supone que funciona, pero para mí me dio un editor para modificar el mensaje de confirmación y ningún método para cambiar qué archivos se incluyeron. Salí del editor sin guardar y descubrí que mi confirmación errónea se cambió para incluir TODOS los archivos modificados.
Tim Tisdall
2
No me queda claro cómo lograr una respuesta a la pregunta usando hg commit --amend. Puede 'des-confirmar' los archivos seleccionándolos primero hg forget, por ejemplo:, hg forget filea; hg commit --amendpero eso parece poco intuitivo. hg strip --keep es probablemente una mejor solución para el hg moderno.
ForeverWintr
1
@JasonS book.mercurial-scm.org/read/… es una buena lectura, aunque en su caso, también podría considerar hg reset: stackoverflow.com/a/31302998/6309
VonC
46

hg strip eliminará por completo una revisión (y cualquier descendiente) del repositorio.

Para usar strip necesitará instalar MqExtension agregando las siguientes líneas a su .hgrc (o mercurial.ini):

[extensions]
mq =

En TortoiseHg, el comando strip está disponible en el banco de trabajo. Haga clic derecho en una revisión y elija 'Modificar historial' -> 'Tira'.

Dado que stripcambia el historial del repositorio, solo debe usarlo en revisiones que aún no se hayan compartido con nadie. Si está utilizando mercurial 2.1+, puede usar fases para rastrear esta información. Si una confirmación aún está en la fase de borrador, no se ha compartido con otros repositorios, por lo que puede eliminarla de forma segura. (Gracias a Zasurus por señalar esto).

Peter Graham
fuente
2
SI la revisión en cuestión todavía está en el borrador de la frase (o tiene acceso a TODOS los repositorios a los que se ha enviado / aplicado y aplica la tira a todos ellos) (que es el caso en esta descripción), entonces esto es taaaan la mejor y más limpia opción.
GazB
44
Si tiene instalado TortoiseHg, hay una interfaz gráfica para activar globalmente mq. En la versión actual: active "archivo-> configuración-> pestaña de configuración global-> extensiones-> mq" o acceda al archivo de configuración a través del botón "Editar archivo".
David
19

Como no puede retroceder, debe fusionar ese compromiso con la nueva cabeza que obtuvo cuando tiró. Si no quieres nada del trabajo que hiciste en él, puedes hacerlo fácilmente con este consejo .

Entonces, si ha sacado y actualizado a su cabeza , puede hacer esto:

hg --config ui.merge=internal:local merge

mantiene todos los cambios en la revisión actualmente desprotegida, y ninguno de los cambios en la revisión no desprotegida (la que escribió que ya no desea).

Esta es una excelente manera de hacerlo porque mantiene su historial preciso y completo. Si dentro de 2 años alguien encuentra un error en lo que usted derribó, puede ver su implementación (no utilizada pero guardada) de lo mismo y decir "oh, lo hice bien". :)

Ry4an Brase
fuente
5

hg rollback es lo que quieres

En TortoiseHg, esto hg rollbackse logra en el diálogo de confirmación. Abra el diálogo de confirmación y seleccione "Deshacer".

texto alternativo

Tim Henigan
fuente
1
Hice una confirmación, luego una extracción y actualización / sincronización. Con estos nuevos cambios que obtuve, decidí que mi último commit está obsoleto y quiero deshacerlo. El botón Deshacer en TortoiseHg está deshabilitado en mi caso.
Martin Buberl
La reversión ahora está en desuso.
UpTheCreek
En la versión actual de Tortoise HG, puede acceder a la opción Revertir / Deshacer desde el elemento del menú Repositorio.
daveywc
Se necesita una cita de @UpTheCreek.
DanMan
@DanMan: verifique el enlace que proporcionó.
UpTheCreek
3

En la versión actual de TortoiseHg Workbench 4.4.1 (07,2018) que puede utilizar Repository- Rollback/undo...:
ingrese la descripción de la imagen aquí

TmTron
fuente
1

Su solución alternativa.

Si no empuja al servidor, clonará en una nueva carpeta, de lo contrario, eliminará (eliminará todos los archivos) de su carpeta de repositorio y clonará nuevo.

ITsDEv
fuente
0

después de haber extraído y actualizado su espacio de trabajo, haga un clic y haga clic derecho en el conjunto de cambios del que desea deshacerse y luego haga clic en modificar historial -> tira, eliminará el conjunto de cambios y señalará la sugerencia predeterminada.

cabhishek
fuente