Mercurial deshacer última confirmación


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

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

Update

En mi caso concreto cometí un conjunto de cambios (no empujado). Entonces saqué y actualizado desde el servidor. Con estas nuevas actualizaciones decidí que mi último commit es obsoleto y no quiero sincronizarlo. Así que parece que hg rollback no es exactamente lo que estoy buscando, porque revertiría la atracción en lugar de mi compromiso.

Author: Gangnus, 2011-01-21

7 answers

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

Utilice hg commit --amend en lugar de rollback para corregir errores en el último commit.

Revertir la última transacción en un repositorio.

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

Ver Sección de Recuperación de TortoiseHg :

texto alt

Este hilo también detalla la diferencia entre hg rollback y hg strip:
(escrito por Martin Geisler que también contribuye en SO)

  • 'hg rollback' will eliminar la última transacción. Las transacciones son un concepto que se encuentra a menudo en las bases de datos. En Mercurial iniciamos 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 completa. Si ocurre un error, la transacción es "revertida" y el repositorio se deja en el mismo estado que antes.
    Puede activar manualmente una reversión con 'hg rollback'. Esto deshará el último comando transaccional. Si un tirón el comando trajo 10 nuevos conjuntos de cambios al repositorio en diferentes ramas, luego ' hg rollback' los eliminará todos. Tenga en cuenta: no hay ninguna copia de seguridad al revertir una transacción!

  • 'hg strip' eliminará un conjunto de cambios y todos sus descendientes. El los conjuntos de cambios se guardan como un paquete, que puede aplicar de nuevo si los necesito de vuelta.

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

Puede 'des-confirmar' archivos olvidándolos primero hg, por ejemplo: hg forget filea; hg commit --amend, pero eso parece poco intuitivo.
hg strip --keep es probablemente una mejor solución para el hg moderno.

 71
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 10:04:30

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

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

[extensions]
mq =

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

Dado que strip cambia el historial del repositorio, solo debe usarlo en revisiones que no hayan sido compartido con nadie todavía. Si está utilizando mercurial 2.1 + puede usar phases para rastrear esta información. Si un commit todavía está en la fase de borrador, no se ha compartido con otros repositorios, por lo que puede eliminarlo de forma segura. (Gracias a Zasurus por señalar esto).

 44
Author: Peter Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-25 12:51:47

Dado que no puedes revertir, debes fusionar ese commit en la nueva cabeza que obtuviste cuando tiraste. Si no quieres nada del trabajo que hiciste en él, puedes hacerlo fácilmente usando este consejo.

Así que si has tirado y actualizado a su cabeza puedes hacer esto:

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

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

Esta es una gran manera hacerlo porque mantiene su historia precisa y completa. Si 2 años a partir de ahora alguien encuentra un error en lo que tiró hacia abajo se puede mirar en su (sin usar pero guardado) implementación de la misma cosa y decir, "oh, lo hice bien". :)

 19
Author: Ry4an Brase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-04 19:08:10

hg rollback es lo que quieres.

En TortoiseHg, el hg rollback se realiza en el diálogo de confirmación. Abra el diálogo de confirmación y seleccione "Deshacer".

texto alt

 5
Author: Tim Henigan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-21 16:00:57

En la versión actual de TortoiseHg Workbench 4.4.1 (07.2018) puede utilizar Repository - Rollback/undo...:
introduzca la descripción de la imagen aquí

 1
Author: TmTron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-25 12:56:00

Después de que haya sacado y actualizado su espacio de trabajo, haga un thg y haga clic derecho en el conjunto de cambios del que desea deshacerse y luego haga clic en modificar historial -> eliminar, eliminará el conjunto de cambios y señalará la punta predeterminada.

 0
Author: cabhishek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-08 16:06:28

Su solución.

Si no envías al servidor, clonarás en la nueva carpeta else washout(eliminar todos los archivos) de la carpeta del repositorio y clonarás new.

 0
Author: ITsDEv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 07:38:58