2012-07-04 26 views
7

Usando git, puedo tirar a la basura una equivocada o accidental de confirmar utilizando un comando comorevertir a una revisión antigua de Mercurial (como git reset)

git reset --soft HEAD^ 

que restablece la rama actual (como master) a el principal de la revisión actual confirma HEAD^ sin tocar el árbol de trabajo; puede reemplazar --soft con --hard si también desea borrar el árbol de trabajo.

Además, si quiero para deshacerse de más de un compromiso, puedo usar un comando como

git reset --hard 53b94d0 

que me trae de vuelta exactamente a cometer 53b94d0 como si nunca hubiera cometido nada después de eso.

¿Cuál es el equivalente de Mercurial (hg)?

Respuesta

19

Aunque Mercurial no ofrece una alternativa fácil y se aleja de la idea de la historia mutable, hay algunas maneras de lograr algo cercano. En esta publicación, esbozaré algunos de ellos.

hg rollback

Si desea específicamente para deshacer la última confirmación, puede utilizar:

hg rollback 

que deshacer el envío de datos (que no toca el árbol de trabajo - que debe ser capaz para seguirlo con hg revert --all o hg update -C si también desea reiniciar todo el directorio de trabajo).

hg clone -r

Supongamos que desea restablecer su repositorio llamado giraffe a 77182fb7451f revisión. Si cd en el directorio padre y ejecute:

hg clone -r 77182fb7451f giraffe new-giraffe 
cp giraffe/.hg/hgrc new-giraffe/.hg/ 

entonces usted va a terminar con nueva jirafa, un repositorio en 77182fb7451f revisión. (El cp es necesario para garantizar que los nuevos-jirafa paths (como "remotos" de GIT) correctamente apuntar a la cesión temporal de origen en lugar de a la carpeta giraffe como lo haría de manera predeterminada.)

Esto es más rápido que reclonación de internet porque solo copia los archivos localmente en su disco (y en muchos sistemas, los vincula duramente para ahorrar aún más tiempo y espacio), pero aún puede consumir mucho tiempo si su repositorio es grande.

hg strip

Si usted quiere hacer las cosas más complicadas con la modificación de la historia comprometerse (que se frunció el ceño un poco en el mundo de Hg, por cierto), en primer lugar que el Mercurial Queues extension añadiendo las siguientes líneas a su .hgrc (no hay necesidad de especificar una ruta después del signo igual):

[extensions]                  
mq = 

Esto le da (entre otras cosas útiles) el comando hg strip para eliminar completamente un conjunto de cambios y todos sus descendientes de un repositorio.De este modo se puede utilizar un comando como:

hg strip 1cc72d33ea76 

si 1cc72d33ea76 es el primer "malo" de cambios en su repositorio que desea eliminar.

Por desgracia, a menudo es difícil de eliminar exactamente los conjuntos de cambios adecuados usando este método y que es muy fácil acabar con múltiples cabezas (que se pueden ver usando hg heads), lo que requiere tediosa aplicación repetida de hg strip antes de poder llegar a donde quieres estar sin cabezas extra.

tira hg utilizando revsets

Uso hg revsets puede eliminar todos los antepasados ​​de . (la versión actual), que son no antepasados ​​de la revisión que desea revertir, usando un comando como:

hg strip "ancestors(.) and not ancestors(77182fb7451f)" 

Asegúrese de que a primera ejecución:

hg log -r "ancestors(.) and not ancestors(77182fb7451f)" 

que le mostrará al l los conjuntos de cambios que hg strip eliminarían, para que pueda asegurarse de que no dañe irreparablemente su historial de confirmaciones (porque tiene copias de seguridad ... ¿verdad?).

+0

Por lo tanto, en hg la restauración/retroceso equivalentes equivale más a cambiar lo que confirma una etiqueta de bifurcación, ¿hay alguna alteración real en la base de datos involucrada? – jthill

Cuestiones relacionadas