¿Cómo puedo revertir un repositorio Git a una confirmación anterior?

¿Cómo revierto de mi estado actual a una instantánea realizada en una confirmación determinada?

Si hago git log, entonces consigo la siguiente salida:

$ git log
 commit a867b4af366350be2e7c21b8de9cc6504678a61b`
 Author: Me <me@me.com>
 Date:   Thu Nov 4 18:59:41 2010 -0400

 ...

 commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
 Autor: Me <me@me.com>
 Fecha:   Thu Nov 4 05:13:39 2010 -0400

 ...

 commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
 Autor: Me <me@me.com>
 Fecha   Thu Nov 4 00:55:06 2010 -0400

 ...

 commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
 Autor: Me <me@me.com>
 Fecha:   Wed Nov 3 23:56:08 2010 -0400

 ...

Cómo revierto a una confirmación del 3 de noviembre, Ej. Confirmación 0d1d7fc?

  • git
  • git-checkout
  • git-reset
  • git-revert
6 Repuestas

Esto depende mucho de lo que quieres decir con "revertir".

Cambiar temporalmente a un confirmación diferente

Si deseas volver temporalmente a esto, tomate tu tiempo, luego vuelve a donde estás, todo lo que tienes que hacer es revisar la confirmación deseada:

#-Esto separará tu HEAD, es decir, te dejara sin ramas para chequear
    git checkout 0d1d7fc32

O si solamente quieres hacer conformaciones miestras estas ahí, realiza una nueva rama mientras estas en esto.

git checkout -b old-state 0d1d7fc32

Para volver a donde estabas, solo verifica nuevamente la rama en la que estabas. (Si has hecho cambios, como siempre cuando se cambian las ramas, tendrás que tratar con ellas según corresponda. Podrias reiniciar para lanzarlas, podrias esconderlas, verificarlas, resaltarlas para llevarlas contigo, podrias confirmarlas a una rama si la quieres allí.

Borrado definitivo a las confirmaciones sin publicar.

Si, por otro lado, quieres realmente deshacerte de todo lo que has hecho desde entonces, hay dos posibilidades. Uno, si no has publicado ninguna de estas confirmaciones, simplemente reinicia:

#Esto destruirá cualquier modificación local.
 #No lo hagas si tienes trabajo sin confirmar que quieras mantener.
 git reset --hard 0d1d7fc32

 # Alternativamente. si hay trabajo para mantener.
 git stash
 git reset --hard 0d1d7fc32
 git stash pop
 # Esto guarda las modificaciones, esnonces reaplica un parche luego del reseteo
 #Podrías obtener conflictos de fusión, si has modificado las cosas que fueron
 #cambiadas desde la confimación que reseteaste.

Si lo arruinas, y ya has desechado tus cambios locales, al menos puedes volver a donde estabas reiniciando de nuevamente.

Deshacer confirmaciones publicadas con nuevas confirmaciones.

Por otro lado, si has publicado el trabajo, es probable que no desees restablecer la rama, ya que esto es efectivamente reescribir el historial. En este cado podrias efectivamente revertir las confirmaciones. Con Git, revertir tiene un significado muy específico: crea una confirmación con el parche inverso para cancelarla. De esta forma no reescribes ningún historial.

#Esto creará tres confirmaciones revertidas separadas.
 git revert a867b4af 25eee4ca 0766c053

 #Esto también toma rangos.  Esto revertira las dos últimas confirmaciones.
 git revert HEAD~2..HEAD

 #Similarmentem puedes revertir un rango de confoirmaciones usando confirmaciones hashes:
 git revert a867b4af..0766c053

 #Revertir una confirmación fusionada.
 git revert -m 1 <merge_commit_sha>

 #Para obtener solo una, puedes usar `rebase -i` para luego aplastarlas
 #o, lo podrías hacer manualmente (Asegúrate de hacerlo ene l nivel superior del repositorio)
 #Obtiene tu índice y árbol de trabajo en el estado deseado, sin cambiar HEAD:
 git checkout 0d1d7fc32 .

 #Luego confirma.  Asegúrate y escribe un buen mensaje describiendo lo que acabas de hacer.
 git confirm

El git-revert manpage realmente cubre mucho en su descripción. Otro link útil es esto git-scm.com página sobre git-revert.

Si decides que no quieres revertir nada, puedes revertir lo revertido (como esta descripto acá) o restablecer al revertido anterior. (Ver la sección previa)

También podrías encotrar una respuesta útil en este caso.
Cómo volver a Head a una ubicación previa? (Detached head)

¿Codificador Rogue?

¿Trabajar por ti mismo y solo quieres que funcione? Sigue las instrucciones debajo, estas han funcionado confiablemente para mi a a varios por años.

¿Trabajar con otros? Git es complicado. Lee los comentarios debajo de esta respuesta antes de hacer algo apresurado.

Revertir una copia de trabajo a la confirmación mas reciente.

Revertir a una confirmación previa, ignorando cualquier cambio.

git reset --hard HEAD

Donde HEAD es la última confirmación en tu rama actual

Revertir una copia de trabajo a una confirmación antigua.

Para revertir una confirmación que es mas antigua que la confirmación más reciente:

#Resetear el indice a una antigua confirmación; remplaza '56e05fced' con tu código de confirmación.
 git reset 56e05fced

 #Mueve el puntero a una HEAD previa.
 git reset --soft HEAD@{1}

 git commit -m "Revert to 56e05fced"

 #Actualiza la copia de trabajo para reflejar la nueva confirmación
 git reset --hard

Los créditos van a una pregunta similar de Stack Overflow, Revert to a commit by a SHA hash in Git?

Hay muchas respuestas complicadas y peligrosas aqui, pero de hecho son fáciles.

git revert --no-commit 0766c053..HEAD
 git commit

Esto revertirá todo, desde el HEAD de nuevo al hash de confirmación, lo que significa que volverá a crear ese estado de confirmación en el árbol de trabajo como si todos los confirmaciones se hubieran regresado. A continuación, puedes confirmar el árbol actual, y este creará una nueva confirmación esencialmente equivalente a la confirmación que has revertido.

(El indicador --no-commit permite a git revertir todas las confirmaciones a la vez; de lo contrario, se le solicitará un mensaje para cada confirmación en el rango, llenando tu historial con nuevas confirmaciones innecesarias).

Esta es una forma fácil y segura de volver a un estado anterior. El historial no se destruye, por eso este puede ser usado por las confirmaciones que ya han sido hechas en público.

La mejor opción para mi y para otros es la opción de restablecer el Git.

git reset --hard <commidId> && git clean -f

Esta ha sido la mejor opción para mi. Es simple, rápida y efectiva!


Nota: Como se mensionó en los comentarios no hagas esto si estas compartiendo tus ramas con otra gente que tengan copias de las antiguas confirmaciones.

También de los comentarios, si quisieras un método menos 'tonto' podrías usar

git clean -i

Antes de contestar agreguemos algo de contexto que explique que es esto HEAD.

¿Primero que todo, qué es HEAD?

HEAD es simplemente una referencia a la confirmación actual (La última) en la rama actual. Solo puede ser un simple HEAD en cualquir tiempo (excluyendo git worktree)

El contexto de HEAD es almacenado dentro de .git/HEAD, y contiene 40 bytes SHA-1 de la confirmación actual.


HEAD independiente

Si no estás en la última confirmación, lo que significa que HEAD está apuntando a una confirmación anterior en el historial, la cual se llama detached HEAD.

En la línea de comandos se verá así: SHA-1 en lugar del nombre de la rama, ya que la HEAD no apunta a la punta de la rama actual:


Algunas opciones de como recuperar desde HEAD independiente.


git checkout

git checkout <commit_id>
 git checkout -b <new branch> <commit_id>
 git checkout HEAD~X // x es el numero de confirmaciones para ir al pasado

Esto verificara a la nueva rama apuntando a la confirmación deseada. Este comando verifcará una confirmación dada.

En este punto podrás crear una rama y comenzar a trabar desde este punto en adelande.

#verifica la confirmación dada.
 #Haciendo esto resultará en un "HEAD independiente" lo que significa que Head
 #no está apuntando a lo último por eso necesitarás verificar la rama
 #para poder actualizar el código.
 git checkout <commit-id>

 #Crear una nueva rama sostenida de una nueva confirmación
 git checkout -b <branch name>


git reflog

También siempre puedes usar reflog. git reflog mostrará cualquier cambio que actualice a HEAD y al revisar la entrada de búsqueda deseada, la CABEZA volverá a este compromiso.

Cada vez que HEAD sea modificado habrá una nueva entrada en el reflog

git reflog
 git checkout HEAD@{...}

Esto te llevara de regreso a cualquier confirmación deseada.


git reset HEAD --hard <commit_id>

"Mueve" Tu HEAD hacia cualquier confirmación deseada

#Estoy destruirá cualquier modificacipon local.
 #No hagas esyo si tienes trabajo sin confirmar y que quieras mantenter.
 git reset --hard 0d1d7fc32

 #Alternativamente hay trabajo para mantener.
 git stash
 git reset --hard 0d1d7fc32
 git stash pop
 #Esto guarda las modificaciones, después reaplica el parche despus de resetear.
 #Podrías tener conflictos de fusión, si has modificado cosas que fueron
 #cambiadas desde la confirmación que reseteaste.

  • Nota: (hace Git 2.7) Tambien puedes usar git rebase --no-autostash.


El esquema ilustra que comando hace que cosa. Como puedes ver aquí reset && checkout modifica el HEAD.

Si quieres "no confirmar" borra el ultimo mensaje de confirmación y coloca los archivos confirmados nuevamente en en escena, usarías el comando:

git reset --soft HEAD~1

  • --soft indica que los archivos no confirmados deberían ser retenidos como archivos de trabajo opuestos a --hard los cuales serian descartados.
  • HEAD~1 es la última confirmación Si quieres volver 3 confirmaciones podrías usar HEAD~3. Si quieres volver a un número de revisión específica podrías tambien hacer ese uso que es su SHA hash.

Este comando extremandamente útil es situaciones donde confirmaste una cosa equivocada quieres deshacer la última confirmación.

Fuente http://nakkaya.com/2009/09/24/git-delete-last-commit/

He tratado muchas maneras de revertir cambios locales en Git, y parece que este funciona de la mejor manera so solo queres revertir al último estado de confirmación.

git add . && git checkout master -f

Descripción corta:

  • Esto NO cra ninguna confimación com git revert lo hace.
  • Esto NO dividirá tu HEAD como git checkout <commithashcode> lo hace.
  • Esto ANULARÁ todos tus cambios locales y BORRARÁ todos los archivos agregados desde la última confirmación en la rama.
  • Esto funciona solo con los nombres de las ramas por lo que de esta manera puede revertir solo a la última confirmación en la rama.

Encontré una manera mucho más conveniente y sencilla de lograr los resultados anteriores:

git add . && git reset --hard HEAD

donde HEAD apunta a la última confirmación en tu rama actual.

Es el mismo código que sugiere boulder_ruby, pero he agregado git add . antes de git reset --hard HEAD para borrar todos los archivos nuevos creados desde la última confirmación, ya que esto es lo que la mayoría de la gente espera, al volver a la última confirmación.