2010-12-14 13 views
13

A menudo noto algunos cambios no deseados cuando reviso mi copia de trabajo (con hg status y hg diff) justo antes de una confirmación. Por ejemplo, podría haber agregado o eliminado temporalmente algún código solo durante una sesión de depuración.¿Puedo revertir un rango de líneas en un archivo con mercurial?

Sé que puedo usar hg revert para eliminar los cambios no deseados, pero esto elimina todos los cambios en el archivo completo. ¿Hay alguna manera de revertir solo una parte de un archivo?

+0

similares: http://stackoverflow.com/questions/876763/mercurial-revert-a -single-hunk – keturn

Respuesta

5

Una forma es usar una herramienta de diferencia gráfica como kdiff3. Si le das el diff y eliges "fusionar el archivo actual", puedes ir línea por línea y elegir lo que quieras.

La mejor manera es cometer más a menudo. Si adquiere el hábito de comprometerse justo antes de agregar el código de depuración, puede confirmar o revertir su código de depuración antes de agregar su código "real", es muy fácil eliminar su código de depuración porque tiene su propia revisión. Alternativamente, puede poner su código de depuración en una rama separada por completo.

+0

+1 He seguido [estas instrucciones] (http://mercurial.selenic.com/wiki/KDiff3) para habilitar el comando 'hg kdiff3', y he encontrado el" Merge - Merge this archivo "elemento del menú. Me tomó un tiempo encontrar que necesitas hacer clic derecho en conflictos para elegir cuál de las dos versiones quieres seleccionar, pero parece que funciona. Voy a intentar esto. –

+0

"Fusionar archivo actual" era la pieza que faltaba del rompecabezas. muchas gracias. –

7

no estoy seguro de si se puede revertir las líneas individuales de manera explícita, pero lo que hago en situación como la suya es cometer el buen código y revertir el resto (el código mal). Este flujo de trabajo es fácil usando la extensión record o crecord de Mercurial (recomiendo la última).

+1

Yo uso: 'hg record -m temp; hg revertir -a; hg purge; hg strip -k .' para hacer exactamente esto, pero también devolver los cambios confirmados temporalmente a la copia de trabajo después de eliminar los cambios no deseados. –

3

La ventana de "Commit" de la GUI TortoiseHg tiene una pestaña "Selección de Hunk" que permite la selección de secciones específicas de los cambios de un archivo que se confirmarán.

+1

..pero no tiene Revertir basado en Hunk .. – user2864740

+0

@ user2864740, revierte el archivo y compromete los bloqueos que deseas mantener. –

1

Tengo una respuesta diferente para su problema, que es el mismo problema que tengo. ¡Este es un gran caso de uso para mercurial queues!

Cuando estoy a punto de empezar a añadir el código de depuración a un cambio que creo que está listo, hago lo siguiente:

hg qnew -m "fix for bug #123" fix.patch # basically a local-only commit 
hg qnew -m "debugging" dbg.patch   # prepare the next changeset at the tip 
[add my debugging] 
hg qrefresh        # update the changeset at the tip 
[...] 
hg qpop         # pop the debugging off the repo history 

Se necesita un poco de tiempo para acostumbrarse - que acaban de tener que reordena tus parches para doblar las correcciones que hayas hecho en el parche de trabajo original.

Además, consulte la extensión del ático de Bill Barry. Esta página habla sobre cómo usarla para algunos flujos de trabajo diferentes y cómo se compara con el uso de mq. https://www.mercurial-scm.org/wiki/AtticExtension

4

Asumiendo que tienen los record y shelve extensiones habilitadas, puede hacerlo de la siguiente manera:

hg record -m "garbage" # pick out and commit the change you want to revert 
hg shelve --all   # temporarily hide other changes 
hg strip tip    # remove the garbage changeset 
hg unshelve    # restore the changes you want to keep 
1

que he estado haciendo esto con la interfaz de usuario de estilo ncurses interactiva hg revert -i que le permite caminar alrededor y seleccionar las piezas desea destruir, ya sea archivo, fragmento de datos o línea por línea, según lo desee, dependiendo de cuán profundo desarrolle sus cambios.

No estoy seguro de si esto es una característica estándar hg o no, usted puede fácilmente verificar suficiente si el suyo tiene que:

> hg revert --help --verbose | grep -- -interactive 
-i --interactive   interactively select the changes (EXPERIMENTAL) 

Sólo recuerda que los cambios que marcan (X) será lo que se atacó con armas nucleares no lo que conservas

0

Si el compromiso donde desea el cambio es, por ejemplo,ba1c841aaff4, la más sencilla es utilizar:

hg meld -r ba1c841aaff4^ <filename> 

Ahora haga clic en una flecha hacia la derecha (hacia la derecha) en el medio para volver a sus líneas, guardar el archivo y cierre MELD. kdiff3 (antiguo y no intuitivo) puede ser una alternativa.

Nota al pie: con el fin de utilizar funden necesita configurar en nuestro archivo ~/.hgrc:

[extdiff] 
cmd.meld = 

[merge-tools] 
meld.args=$base $local $other 
Cuestiones relacionadas