Hg:

2011-11-19 23 views
7
eliminar última se compromete

He usado Git en el pasado y yo soy un novato Hg:Hg:

He estructura siguiente repositorio:

o [> default] commit A 
| 
o commit B 
. 
. 
. 
o <a-tag] 
| 

He actualizado al comprometerse con el a-tag y cometió algunas otras confirmaciones. Ahora tengo

o [> default] commit C 
| 
o commit D 
| 
| o [default] commit A 
| | 
| o commit B 
| . 
| . 
| . 
|/
o <a-tag] 
| 

ahora (antes de empujar) que darse cuenta de que yo tenía mis compromete commit Ccommit D y basado en el mal confirmación. ¿Cómo puedo volver al estado inicial (sin tener que volver a clonar el repositorio) soltando estos commits commit C y commit D (colgante al git reset --hard a-tag)?

Respuesta

8

Puede usar 'strip' para eliminar definitivamente commits y todos sus descendientes.En el caso de tener que especificar el ID de "D" de revisión:

hg strip -r D 

nota: la extensión MQ debe estar encendido:

[extensions] 
mq= 

Mercurial copias de seguridad bultos de los conjuntos de cambios despojados en .hg/franja -backup por lo que esta operación es bastante segura.

1

Me limitaría a clonar desde el punto apropiado y eliminar el repositorio anterior. Sin clonación, considere hg backout para deshacer primero C y luego D, o si este es su objetivo final hg rebase para mover tanto C como D al punto commit A.

1

Backout C + retroceso D eliminará estos 2 commits, pero agrega 3 adicionales (retroceso + retroceso + fusión). "Limpiar" eliminar de la historia puede ser

Si desea que sólo cambiar el padre incorrecto para corregir, tiene que usar rebase, como @chill mencionó

4

Usted dice sin clonación, y voy a llegar a eso, pero primero quiero señalar que al hacer esto:

cd .. 
hg clone -r -2 yourrepo yournewrepo 

es una acción instantánea que le consigue un nuevo clon, a nivel local, sin los dos últimos comete en su edad de recompra. Debido a que es un clon local, utiliza enlaces duros (incluso en Windows) por lo que el repositorio no ocupa espacio de disco adicional.

Esa es la solución clásica de Mercurial. Mercurial fue construido con la idea de una historia inmutable. Si hay algo en la historia que lamenta que cometa su inverso (que es lo que backout hace), entonces el historial muestra el error y su corrección, como un libro de registro de científicos. Si no puede/no puede soportar tenerlo en la historia, haría un clon que lo excluye como lo mostré anteriormente.

No todos pueden ser tan ... incondicionales ... sobre su historial, por lo que han aparecido muchas extensiones que modificarán el historial, pero deben habilitarse específicamente. En su caso, la extensión rebase, que ya tiene instalada (ahora viene con Mercurial), hará exactamente lo que quiera. Solo tiene que habilitarlo en su ~/.hgrc y luego reemplazar D en A. Si realmente quiere que C haya desaparecido, el comando strip de la extensión mq lo hará. También se envía con Mercurial.