2009-05-28 7 views
12

Bazaar tiene un maravilloso comando uncommit, que simplemente deshace el último commit. ¿Hay algún equivalente en Mercurial?"bzr uncommit" equivalente en Mercurial?

Editar: comando uncommit del bazar no modifica archivos - se elimina la última confirmación y datos asociados (útil, por ejemplo, cuando note demasiado tarde que hay un error tipográfico en un mensaje de confirmación o un archivo no era añadido que debería haber sido).

Por ejemplo:

$ bzr ci -m "Fixed a proooblem" <-- problem is misspelt 
$ bzr uncommit 
... 
$ bzr ci -m "Fixed a problem" <-- Exactly as if the first commit was correct. 

Respuesta

8

Tal vez hg backout tip? Recomiendo http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html para todos los detalles sobre hg backout, cómo difiere de hg revert, y muchos temas relacionados, pero si entiendo lo que uncommit hace, parece exactamente equivalente a hg backout tip.

Editar: en un comentario que ha aclarado que quiere "borrar el historial" - eso es difícil (a menos que sea MUY rápido en el sorteo, tal vez; -) ... por el libro de frijol rojo otra vez :

Dado que Mercurial trata el historial como acumulativo -todos los cambios se basan en todos los cambios que le precedieron- generalmente no puede simplemente hacer que los cambios desastrosos desaparezcan. La única excepción es cuando acaba de realizar un cambio y no ha sido empujado o arrastrado a otro repositorio. Eso es cuando se puede utilizar con seguridad el comando hg rollback

Así que si lo que desea es tratar de "hace desaparecer" (y tienes la suerte de que todavía no ha sido empujado o tirado en otra parte) , entonces hg rollback puede ser un mejor enfoque!

+0

Cerrar, pero no del todo. 'bzr revert' dejará todos los archivos en su lugar, listos para volver a comprometerse. –

+0

¿te refieres a "bzr uncommit"? –

+0

err, sí, así es ... Gracias. –

0

no "hg revert" hacer eso?

+0

Estás en lo correcto. hg revert es el comando equivalente. –

+0

Revertirá los archivos, pero me gustaría que todo el compromiso (mensaje y todo) desaparezca del historial. –

+0

O tal vez no hay algo 'hg help revert' no me está mostrando ...? –

0

Al leer los comentarios, parece que quiere una forma de eliminar el registro de la confirmación sin deshacer los cambios en el archivo. En Mercurial, no hay una forma automatizada de hacer esto. hg revert es lo más cerca que va a llegar.

Sin embargo, usted podría hacer esto con un par de pasos manuales. Cuando invoca hg revert, su comportamiento predeterminado es tomar los archivos en el conjunto de cambios que está revertiendo y cambiarles el nombre como filename.ext.orig, donde ext es la extensión original del archivo. Las versiones revertidas toman el nombre del archivo original. Entonces, lo que podría hacer es ejecutar hg revert, eliminar los archivos con los nombres originales y eliminar .orig de los nombres de los archivos de copia de seguridad. Luego vuelva a comprometerse con su mensaje de registro corregido. Simplemente no hagas esto con otra revisión que no sea la sugerencia, ya que probablemente obtendrás muchos archivos modificados y olvidarás cuáles pertenecieron a cada conjunto de cambios.

Tampoco recomendaría hacer esto si ya ha enviado sus conjuntos de cambios a un repositorio remoto. Solo haz esto si todo sigue siendo solo local.

Deseo saber si necesita más información. Tuve que hacer esto en ocasiones, así que estoy familiarizado con el proceso.

+0

Gracias por el comentario, pero creo que 'hg rollback' es lo que estoy buscando. –

+0

Desde la línea de comando de hg help on rollback, "También restaurará el estado del directorio en el momento de la última transacción". ¿No es esto lo que intentas evitar? –

+0

@Marc: no, él quiere que el estado del directorio vuelva también. Eso es lo que hace un seguimiento de los archivos agregados, por ejemplo. Entonces "hg add foo.c; hg commit; hg rollback" dejará foo.c agregado según el "estado de hg". –

23

Desea el comando hg rollback, pero consulte a continuación si está utilizando Mercurial 2.2 o posterior.

El comando rollback eliminará la última transacción de su repositorio. Un compromiso es una transacción, por lo que puede utilizar esto como

% hg commit -m 'My elaburate bugfix.' foo.c foo.h 
% hg rollback 
% hg commit -m 'My elaborate bugfix.' foo.c foo.h 

Después de la reversión de los archivos volverán a verse modificado, y esto significa que la segunda se comprometen almacenará los mismos cambios que la primera, pero con una mejor mensaje de compromiso.

Cuidado:hg rollback es más poderoso que una simple función de "uncommit" y usted puede utilizarlo para tirar a la basura el trabajo si no se tiene cuidado. Para tirar una confirmación hacer

$ hg commit -m 'My big and very difficult bugfix' 
$ hg pull --update 
$ hg rollback 

Usted ha perdido ahora la última confirmación que ha hecho y ya informado la copia de trabajo a otra revisión, los cambios en los que cometen son ido. Por lo tanto, solo debe usar hg rollback para deshacer una confirmación si está seguro de que hg commit fue realmente el último comando que operaba en la copia de trabajo.

Además, si no ha entregado el mensaje de confirmación en la línea de comandos, no puede presionar la flecha hacia arriba dos veces para rehacer la confirmación después de una reversión. Sin embargo, Mercurial 1.5 y posterior guardará su último mensaje de confirmación en .hg/last-message.txt para que siempre pueda encontrarlo nuevamente después de una reversión.

Mercurial 2.2 tiene una nueva --amend bandera para hg commit. Esto permite modificar el último compromiso con nuevos cambios. Simplemente incorpora los cambios enumerados en hg status en la confirmación principal, como si hubiera retrocedido y cometido de nuevo.

0

También existe el comando "hg strip" desde la extensión "mq". Es un equivalente casi exacto de "bzr uncommit". Sin embargo, ten cuidado cuando empujaste tu commit erróneo antes a otro repositorio, se volverá a crear con el tirón más cercano.

+0

Disculpe, esto es incorrecto: 'hg strip' eliminará los conjuntos de cambios del repositorio, mientras que' bzr uncommit' volverá a establecer el repositorio y el árbol de trabajo en el estado en el que se encontraban inmediatamente antes de la confirmación. –

+0

Bueno, esa es exactamente la razón por la que usé la palabra 'casi' - la única diferencia parece ser el estado del directorio de trabajo. Simplemente pensé que vale la pena mencionarlo, ya que este es el único equivalente de Mercurial para 'bzr uncommit' (y tristemente, uno no obvio, por lo que es difícil de encontrar), capaz de eliminar múltiples conjuntos de cambios NO inmediatamente después de la confirmación. De acuerdo con los documentos de Bazar, bzr uncommit puede hacer eso. Si conoce otro comando Mercurial que altera la historia capaz de eliminar múltiples conjuntos de cambios (como por ejemplo 'bzr uncommit -r 1'), hágamelo saber. Estaré feliz de aprender sobre eso. –

Cuestiones relacionadas