2012-01-04 13 views
230

Dado un cambio que se ha cometido usando commit, y luego revertido usando revert, ¿cuál es la mejor manera de deshacer ese reverso?¿Cómo puedo "deshacer" una confirmación de Git revertida?

Idealmente, esto debería hacerse con una nueva confirmación, para no volver a escribir el historial.

+53

¿No se revierte el trabajo de revertir? – Mat

+2

Posible duplicado de [¿Cómo puedo arreglar una confirmación de git revertida?] (Http: // stackoverflow.com/questions/5354682/how-can-i-fix-a-reverted-git-commit) –

Respuesta

205

Si no ha empujado a ese cambio, sin embargo, git reset --hard HEAD^

De lo contrario, revirtiendo la reversión está perfectamente bien.

Otra forma es git checkout HEAD^^ -- . y luego git add -A && git commit.

+0

Tenga en cuenta que si desea deshacer-revertir sin aplicar inmediatamente los cambios originales a la rama principal, puede (1) restaurar la bifurcación original si se elimina, (2) haga clic en "revertir" ** en la bifurcación de revertir ** como lo señala Adam, luego (3) haga clic en "editar" en el encabezado de la PR resultante y cambie la bifurcación de destino a la bifurcación original de maestro. Ahora su rama original puede fusionarse nuevamente para efectuar los cambios anteriormente revertidos. – pauljm

+2

Gracias. Acabo de revertir la reversión original y funcionó bien. – Simon

+0

Sí, revertir una confirmación revertida es análogo a restablecer esa confirmación. ¡Gracias! –

216

git cherry-pick <original commit sha>
hará una copia del original cometió, esencialmente volver a aplicar el commit

Revertir la operación de revertir va a hacer lo mismo, con un desordenado mensaje de registro:
git revert <commit sha of the revert>

Cualquiera de estas formas le permitirán git push sin sobrescribir el historial, ya que crea una nueva confirmación después de la reversión.
Al escribir el sha cometer, que normalmente sólo se necesitan los primeros 5 o 6 caracteres:
git cherry-pick 6bfabc

+24

Esta es fácilmente la solución más elegante y completa para la pregunta de OPs. Mucho mejor que la respuesta aceptada con sus suposiciones sobre el compromiso de revertir en la CABEZA del árbol de commits. La OP también solicitó específicamente una solución que no reescriba el historial, por lo que la solución difícil que se ofrece en la respuesta aceptada es simplemente errónea. – Timo

+1

Esto no funcionó para mí cuando tengo un compromiso de fusión. –

+0

Muchas gracias. ¡Esto ha ahorrado mucho estrés! – SwimmingG

2

Es parece estúpido para mí. Pero yo había estado en la misma situación y revertí por compromisos revertidos. Revertí el número, así que tuve que revertir para cada 'revertir commit'.

Ahora mi historial de commits se ve un poco extraño.

weird history

Es un proyecto de mascotas por lo que está bien. Pero para el proyecto de la vida real, preferiría ir a la última confirmación antes de revertir la restauración de todos los códigos revertidos en una confirmación y un comentario más razonable.

+3

Puede que le interesen las respuestas a otra pregunta mía: http://stackoverflow.com/questions/10415565/how-to-revert-multiple-commits-as-part-of-a-single-commit – JimmidyJoo

+1

Puede evite el autocompromiso y elija su mensaje de confirmación con --no-commit flag al revertir y luego confirmar con el mensaje correspondiente –

0

Si no le gusta la idea de "revertir una reversión" (especialmente cuando eso significa perder información histórica para muchos commits), siempre puede dirigirse a la documentación de git sobre "Reverting a faulty merge".

Dada la situación después de comenzar

P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E <-- fixed-up topic branch 

(W es su reversión inicial de la fusión M; D y E son soluciones a su rama de la característica inicialmente roto/commit)

Puede ahora simplemente reproducir comete a a E, de manera que ninguno de ellos "pertenece" a la fusión revertido:

$ git checkout E 
$ git rebase --no-ff P 

la nueva copia de su rama ya se puede fusionar a master ag ain:

A'---B'---C'------------D'---E' <-- recreated topic branch 
/
P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E 
Cuestiones relacionadas