20339 votos

Deshacer el último comando Git commit?

Accidentalmente, he añadido el directorio incorrecto que contiene mis archivos en Git. En lugar de agregar un archivo .java, he añadido el directorio que contiene el archivo .class.

¿Cómo puedo deshacer esta acción?

22013voto

Esko Luontola Puntos 53877

De la documentación de git-reset:

Deshacer un commit y rehacer

$ git commit ...              (1)
$ git reset --soft HEAD~1     (2)
$ edit                        (3)
$ git add ....                (4)
$ git commit -c ORIG_HEAD     (5)
  1. Esto es lo que desea deshacer

  2. Esto se realiza con mayor frecuencia cuando se acordó de lo que usted acaba de hacer commit está incompleto, o escribió mal el mensaje de commit, o ambos. Deja el árbol de trabajo como estaba antes del "reset". (Las comillas pueden o no ser necesarios en su shell)

  3. Realizar las correcciones a los archivos del arbol de trabajo.

  4. Añadir los cambios para el commit

  5. "reset" de las copias del viejo head a .git/ORIG_HEAD; rehacer el commit empezando con su mensaje de registro. Si no necesita editar el mensaje, usted puede dar la opción -C en su lugar.

10463voto

Kyralessa Puntos 76456

Deshacer un commit asusta un poco si no se sabe cómo funciona. Pero en realidad es increíblemente fácil si se entiende.

Digamos que tienes esto, donde C es tu HEAD y (F) es el estado de tus archivos.

   (F)
A-B-C
    ↑
  master

Deseas destruir el commit C y nunca lo volverlo a ver. Haces esto:

git reset --hard HEAD~1

El resultado es:

 (F)
A-B
  ↑
master

Ahora B es la HEAD. Porque usó --hard, los archivos se restablece a su estado en cometer B.

Ah, pero supongamos cometer C no fue un desastre, pero sólo un poco. Usted quiere deshacer de la confirmación, pero mantener los cambios por un poco de edición antes de hacer un mejor cometer. Volver a empezar desde aquí, con C como su HEAD:

   (F)
A-B-C
    ↑
  master

Usted puede hacer esto, dejando fuera de la --hard:

git reset HEAD~1

En este caso el resultado es:

   (F)
A-B-C
  ↑
master

En ambos casos, la HEAD es simplemente un puntero al último commit. Cuando usted hace una git reset HEAD~1, de decirle a Git a mover la HEAD puntero de un commit. Pero (a menos que use --hard) de salir de sus archivos como estaban. Así que ahora, git status muestra los cambios que ha marcado en C. Usted no ha perdido nada!

Para el contacto más ligero, incluso se puede deshacer su confirmación, pero dejan sus archivos y su índice:

git reset --soft HEAD~1

Esto no sólo deja a sus archivos, con lo que incluso deja su índice solos. Cuando usted haga git status, verás que los mismos archivos que se encuentran en el índice como antes. De hecho, justo después de este comando, usted podría hacer git commit y estaría rehaciendo la misma revisión que acabamos de tener.

Una cosa más: Supongamos que destruir un commit como en el primer ejemplo, pero luego descubre que necesitaba después de todo? Mala suerte, ¿verdad?

Nope, no hay todavía una manera de conseguirlo de nuevo. Tipo git reflog y verá una lista (parcial) de cometer shas, que se ha movido alrededor. Encontrar la confirmación se destruyó, y hacer esto:

git checkout -b someNewBranchName shaYouDestroyed

Ahora que ha resucitado, que se comprometen. Se compromete en realidad no se destruyen en Git para algunas de 90 días, por lo que normalmente puede regresar y rescatar a uno que no tenía la intención de deshacerse de él.

2030voto

Andrew Puntos 30079

Hay dos maneras de "deshacer" su último commit, dependiendo de si ya ha hecho su commit público (empujado a su repositorio remoto):

Cómo deshacer un commit local

Digamos que he hecho un commit local, pero ahora quiero eliminar ese commit.

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

Para restaurar todo a la forma en que estaba antes de la última commit, necesitamos reset al commit antes de HEAD :

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

Ahora git log mostrará que nuestro último commit ha sido eliminado.

Cómo deshacer un commit público

Si ya has hecho públicos tus commits, querrás crear un nuevo commits que "revertirá" los cambios que hiciste en tu anterior commits (HEAD actual).

git revert HEAD

Sus cambios serán revertidos y estarán listos para que usted pueda commit:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Para más información, consulte Conceptos básicos de Git - Deshacer cosas .

1714voto

bdonlan Puntos 90068

Añade/elimina archivos para conseguir las cosas como quieres:

git rm classdir
git add sourcedir

A continuación, modifique el commit:

git commit --amend

El anterior y erróneo commit será editado para reflejar el nuevo estado del índice - en otras palabras, será como si nunca hubieras cometido el error en primer lugar.

Tenga en cuenta que sólo debe hacer esto si no ha empujado todavía. Si ya lo ha hecho, sólo tendrá que commit una corrección normalmente.

983voto

Lennart Koopmann Puntos 4533
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

o

git reset --hard HEAD~1

Advertencia: El comando anterior eliminará permanentemente las modificaciones del .java archivos (y cualquier otro archivo) que quería commit.

El hard reset a HEAD-1 establecerá su copia de trabajo al estado del commit antes de su commit erróneo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X