2010-09-21 14 views
37

Hice un gran oops, y podría necesitar algo de ayuda para deshacerlo.Deshacer un empuje de hg (retroceso?)

Tenemos dos repositorios, un repositorio bastante estable, y un repositorio en el que estamos trabajando para realizar cambios. Acabo de corregir un defecto en nuestro repositorio estable, y lo estaba moviendo al repositorio de trabajo. Saqué del repositorio estable, me fusioné y luego, accidentalmente, lo llevé al repositorio estable.

El repositorio estable ahora se ve así:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

donde a es la confirmación que debe ser la punta del repositorio estable, b es todo lo que hemos hecho en el repositorio de desarrollo, y c es el punto en el que hemos ramificado el repositorio de desarrollo.

¿Cómo hago para no poder volver a:

*a 
| 
*c 

(sé que no puedo hacer cambios desaparecen, sólo estoy en busca de una estructura funcional ...)

He leído algunas cosas que me hacen pensar que hg retroceso es el comando que necesito, pero no estoy muy seguro de lo que hace.

Respuesta

45

hg rollback revierte la última transacción, por lo que se quedaría con la fusión sin terminar, que tiene que usar hg update -C para salir.

Si no desea * b (lo tiene en otro clon), active la extensión MQ incorporada y ejecute hg strip -r <*b>. Deshará de * b y * fusionarse. Por defecto, guarda una copia de seguridad en caso de que cambie de opinión otra vez.


ACTUALIZACIÓN (por @ comentarios de Rudi: lo siento, se perdió el "ya empujados" parte)

Desde la fusión ya se empuja hacia fuera, NUNCA hacer lo que he sugerido anteriormente. Los correos electrónicos de odio de otros desarrolladores hubieran sido el mejor resultado.

hacer esto en su lugar:

hg up -r<*merge> 
hg revert -r<*a> -a 
hg ci -m "undo unintended merge" 

O bien, podría ser más kosher:

hg up -r<*merge> 
hg backout -r<*merge> --parent<*a> 
+1

Como la fusión ya está presionada, la fusión-confirmación no se puede deshacer (las operaciones de inserción y extracción también son transacciones). Además, esta operación será necesaria en todas las copias de trabajo que extrajeron este compromiso del repositorio estable. – Rudi

+0

¿Cuál es la diferencia entre utilizar retroceso y revertir? Terminé usando la reversión, pero me gustaría saber mis opciones (¡aunque espero que nunca vuelva a suceder!) – Neil

+2

'backout' compromete un nuevo conjunto de cambios sobre sus conjuntos de cambios existentes para invertir efectivamente los cambios. 'revert' cambia su copia de trabajo y no confirma. –

0

hg rollback revertirá la última confirmación, eliminando cualquier historial que de otro modo se hubiera realizado.

Por lo tanto, si se inicia con esto:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

hg rollback dará:

*a *b 
|/
*c 

nota de que sólo se puede hacer hg rollback sólo una vez.

Debe hacer una copia de seguridad completa del repositorio antes de realizar la reversión. Para hacer esto, simplemente hg clone todo el repositorio.

+1

Creo que quieres decir retroceso, no retroceso. :) –

+0

Acabo de actualizar esta publicación, así que no debería estar bien :) –

2

Creo que es demasiado tarde para hacer hg rollback puesto que ya ha empujado a los cambios.

Puede probar con extensiones MQ, pero esto también funciona localmente. hg strip solo modificará su repositorio local. Por supuesto, podría intentar modificar el repositorio del servidor directamente en el servidor, pero si alguien lo extrajo, ya es demasiado tarde.

Otra opción se describe en chapter 9 de hgbook en la sección Retroceso de una fusión. Implica el comando hg backout pero puede ser una exageración para usted ...

Sugiero hg update -C a * una revisión, combine con la sugerencia e ignore todos los cambios de * merge? Su repositorio se verá más o menos como esto que:

*second merge 
| \ 
| \ 
| \  
|  \ 
*merge | 
| \ | 
| \ | 
| *b | 
*a |/
|// 
*c--- 

comandos para esto son

  • $ hg --config ui.merge=internal:local merge #keep my files
  • $ hg --config ui.merge=internal:other merge #keep their files

Más detalles se puede conocer here.

0

Todos presentan una solución poco complicada a este problema, que puede ocurrirle a cualquiera de nosotros.

Lo que hice, inicié sesión en el escritorio remoto en mi repositorio central, y allí con la extensión mq cambié el estado de revisión a "borrador" y "stip" -ed ellos.

El único inconveniente es que si alguien tiene una copia del repositorio con las revisiones eliminadas y va a presionar, volverán a aparecer. Así que si puedes, pedir a los demás a a) hacer lo mismo (borrador, tira) b) eliminar el repositorio local y sincronizar con uno modificado

Todo se puede lograr fácilmente con TortoiseHg.