2012-02-10 16 views
6

Estoy usando mercurial VCS, he forzado equivocadamente tres commits y quiero que se deshagan, ¿se puede lograr esto? Estoy bastante seguro de que no se propagaron cambios a nadie desde el repositorio al que presioné, así que estoy seguro de que esto no romperá el código de nadie ...Mercurial deshacer tres hg push

He intentado retroceder pero desde que presioné No puedo deshacer nada de la manera correcta. También sé sobre retroceso de hg, pero no estoy seguro de si debería usar este para lo que necesito ...

¡Gracias!

EDITAR

Este es el registro gráfico, se me olvidó mencionar que algunas confirmaciones eran parte de una fusión, pero ellos también tienen que ser deshecho ...

tip 
| 
a 
| \ 
| b 
|/
c 
| 
d 

tengo que devolver el punta a C o D si no hay otra manera de prevenir que debido a la fusión ...

+0

No entiendo cómo podría ser el registro de gráficos así. No puede fusionar 'b' con' c' ya que 'c' es un antecesor de' b'. ¿Cómo terminaste con el conjunto de cambios 'a'? ¿Es realmente una fusión? ¿O hay más conjuntos de cambios involucrados que dejaste fuera? –

+0

Permítanme reformular eso. No parece haber ningún punto en la fusión ya que la historia lineal iría 'd' -'c' -'b' -'a', no es necesario fusionar' c' y 'b' en absoluto. –

Respuesta

6

Si ya está empujado, sólo hay dos cosas que usted puede hacer ahora:

1) Si puede eliminar el repositorio central y reemplazarlo por otro:
Puede clonar el repositorio central, pero dígaselo a Mercurial to clone only up to changeset "c".
Luego puede tomar este repositorio (que no tiene los cambios incorrectos) y reemplazar el "antiguo" depósito central (el que tiene con los cambios incorrectos).

Desventaja: si alguien ya sacó las confirmaciones no deseadas y luego las vuelve a presionar, vuelven a estar en el depósito.
Por lo tanto, debe asegurarse de que nadie cometió los errores o que todos los que eliminaron eliminen el clon.

2) Si la opción 1 no es posible, se puede utilizar hg backout para deshacer los efectos de los cambios equivocadas - no los propios Cambios Noticias.
Cita desde el enlace:

Backout funciona mediante la aplicación de un conjunto de cambios que es lo opuesto del conjunto de cambios que se retiró. Ese nuevo conjunto de cambios está comprometido con el repositorio y finalmente se fusionó.

Así que los tres conjuntos de cambios erróneos se mantendrá en el repositorio, se añadirán más otros tres, cada uno de ellos revertir los efectos de uno de los tres conjuntos de cambios erróneos.
Si lo hace de esta manera, no importa si alguien más ya realizó los cambios incorrectos ... tan pronto como saca los tres conjuntos de cambios "de retroceso", todo vuelve a estar bien.

+0

gracias! la primera solución que mencionaste fue la que utilicé ... –

2

Si está seguro de que el impulso es lo último que le pasó a ese repositorio remoto, lo que significa que ni usted ni nadie más lo presionaron, puede iniciar sesión en ese sistema y ejecutar hg rollback.

Si se trata de un repositorio en una máquina a la que se puede ssh puede ejecutar este comando en el sistema local:

ssh [email protected] hg -R /path/to/the/repo rollback 

Como siempre, por qué ser muy cuidadoso con rollback. Deshace la última acción en el repositorio sin alterar el directorio de trabajo, y no siempre está claro cuál fue la última acción. Por ejemplo, esto es datalosss:

...hack... 
hg commit -m 'important work' 
hg update somewhere else 
hg rollback 

¡Yikes!

Cuestiones relacionadas