78 Pregunta: ¿Cómo deshago las confirmaciones locales más recientes en Git?

pregunta creada en Wed, May 29, 2019 12:00 AM

Accedí accidentalmente los archivos incorrectos a Git , pero no he presionado el compromiso de el servidor todavía.

¿Cómo puedo deshacer esas confirmaciones del repositorio local?

    
19738
  1. Advertencia: solo debes hacer esto si aún no has presionado la confirmación a un control remoto; de lo contrario, estropearás el historial de otras personas que ya han retirado la confirmación. el mando a distancia
    2015-05-13 21: 18: 57Z
  2. Aquí está una publicación muy clara y completa sobre deshacer cosas en git, directamente de Github.
    2015-06-08 19: 39: 17Z
  3. Antes de publicar una nueva respuesta, considera que ya hay más de 65 respuestas para esta pregunta. Asegúrese de que su respuesta contribuya con lo que no está entre las respuestas existentes.
    2017-06-15 15: 26: 36Z
  4. ¿Sabes qué necesita git? git undo, eso es todo. Entonces, la reputación que tiene git para manejar los errores cometidos por nosotros, los simples mortales desaparece. Implementar presionando el estado actual en una pila de git antes de ejecutar cualquier comando git. Afectaría el rendimiento, por lo que sería mejor agregar un indicador de configuración para habilitarlo.
    2018-03-20 01: 45: 28Z
  5. @ YiminRong Eso se puede hacer con la característica alias de Git: git-scm.com/book/en/v2/Git-Basics-Git-Aliases
    2018-10-05 14: 50: 08Z
30 Respuestas                              30                         

Deshacer una confirmación y rehacer

 
$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Esto es lo que quieres deshacer.
  2. Esto deja su árbol de trabajo (el estado de sus archivos en el disco) sin cambios, pero deshace la confirmación y deja los cambios que realizó sin programar (para que aparezcan como "Cambios no preparados para confirmación" en git status, por lo que Necesito agregarlos nuevamente antes de comprometerse. Si solo desea agregar más cambios al compromiso anterior, o cambiar el mensaje de confirmación 1 , podría usar git reset --soft HEAD~ en su lugar, que es como git reset HEAD~ (donde HEAD~ es lo mismo que HEAD~1) pero deja los cambios existentes en escena.
  3. Haga correcciones a los archivos del árbol de trabajo.
  4.  git add cualquier cosa que desee incluir en su nuevo compromiso.
  5. Confirme los cambios, reutilizando el mensaje de confirmación anterior. reset copió la vieja cabeza a .git/ORIG_HEAD; commit con -c ORIG_HEAD abrirá un editor, que inicialmente contiene el mensaje de registro de la confirmación anterior y le permite editarlo. Si no necesita editar el mensaje, puede usar la opción -C.

Tenga cuidado, sin embargo, si ha agregado nuevos cambios al índice, el uso de commit --amend los agregará a su confirmación anterior.

Si el código ya está insertado en su servidor y usted tiene permisos para sobrescribir el historial (rebase) entonces:

 
git push origin master --force

También puedes ver esta respuesta:

Cómo moverse ¿Volver a una ubicación anterior? (Cabeza separada) & Deshacer confirmaciones

La respuesta anterior le mostrará git reflog, que se utiliza para averiguar qué es el SHA-1 al que desea volver. Una vez que haya encontrado el punto al que desea deshacer para usar la secuencia de comandos como se explicó anteriormente.


1 Sin embargo, tenga en cuenta que no necesita restablecer una confirmación anterior si acaba de cometer un error en su mensaje de confirmación . La opción más fácil es git reset (para eliminar los cambios realizados desde entonces) y luego git commit --amend , que se abrirásu editor de mensajes de confirmación predeterminado rellenado previamente con el último mensaje de confirmación.

    
21340
2019-05-20 20: 06: 45Z
  1. Y si el commit fue a la rama incorrecta, puede git checkout theRightBranch con todas las etapas de cambios. Como tenía que hacer.
    2010-10-05 15: 44: 20Z
  2. Si está trabajando en DOS, en lugar de git reset --soft HEAD^ necesitará usar git reset --soft HEAD~1. ^ Es un carácter de continuación en DOS, por lo que no funcionará correctamente. Además, --soft es el valor predeterminado, por lo que puede omitirlo si lo desea y simplemente decir git reset HEAD~1.
    2011-04-13 14: 15: 10Z
  3. Además, en zsh tienes que citar ^, así que git reset --soft 'HEAD^' ... al menos lo hice
    2011-10-27 18: 24: 16Z
  4. (La corrección a lo que escribí anteriormente es --mixed por defecto. --mixed significa conservar los archivos modificados, pero no mantenerlos en el índice. --soft mantendría los archivos modificados y manténgalos en el índice como estaban justo antes de la confirmación cambiada. Disculpe la confusión.)
    2011-11-17 02: 40: 53Z
  5. los usuarios de zsh pueden obtener: zsh: no matches found: HEAD^: necesitas escapar ^ es decir, git reset --soft HEAD\^
    2013-02-21 17: 47: 56Z

Deshacer un compromiso es un poco atemorizante si no sabes cómo funciona. Pero en realidad es increíblemente fácil si entiendes.

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

 
   (F)
A-B-C
    ↑
  master

Desea atacar con nuke C y no volver a verlo nunca . Usted hace esto:

 
git reset --hard HEAD~1

El resultado es:

 
 (F)
A-B
  ↑
master

Ahora B es la CABEZA. Debido a que usó --hard, sus archivos se restablecen a su estado en el compromiso B.

Ah, pero supongamos que cometer C no fue un desastre, sino solo un poco. Desea deshacer el compromiso pero conserva los cambios para editar un poco antes de realizar un mejor compromiso. Empezando de nuevo desde aquí, con C como tu CABEZA:

 
   (F)
A-B-C
    ↑
  master

Puedes hacer esto, dejando fuera el --hard:

 
git reset HEAD~1

En este caso, el resultado es:

 
   (F)
A-B-C
  ↑
master

En ambos casos, HEAD es solo un puntero a la última confirmación. Cuando haces un git reset HEAD~1, le dices a Git que mueva el puntero HEAD hacia atrás una comilla. Pero (a menos que use --hard) deja sus archivos como estaban. Así que ahora git status muestra los cambios que has registrado en C. ¡No has perdido nada!

Para el toque más ligero, incluso puedes deshacer tu confirmación pero dejar tus archivos y tu index :

 
git reset --soft HEAD~1

Esto no solo deja sus archivos solos, sino que también deja su índice solo. Cuando hagas git status, verás que los mismos archivos están en el índice que antes. De hecho, justo después de este comando, podrías hacer git commit y estarías rehaciendo el mismo compromiso que acabas de tener.

Una cosa más: Supongamos que destruyes una confirmación como en el primer ejemplo, pero luego descubres que, después de todo, lo necesitabas . Suerte difícil, ¿verdad?

No, hay todavía una forma de recuperarlo. Escriba git reflog y verá una lista de confirmación (parcial) shas (que es, hashes) en los que se ha movido. Encuentre el compromiso que destruyó y haga esto:

 
git checkout -b someNewBranchName shaYouDestroyed

Ahora has resucitado ese compromiso. Los compromisos en realidad no se destruyen en Git durante unos 90 días, por lo que generalmente puedes regresar y rescatar uno que no quisiste eliminar.

    
10293
2018-12-07 09: 56: 29Z
  1. @ dma_k, sí. O podrías hacer git reset --hard HEAD^^ una vez. Utilizo la notación tilde (~) porque la notación caret (^) no funciona en DOS.
    2012-02-25 15: 02: 44Z
  2. Otro buen consejo: puede volver a adjuntar la rama a la confirmación de la que la eliminó con git branch -f <branch> <commit-id>. ¡Se ahorra tener que volver a crear confirmaciones!
    2012-06-22 13: 11: 11Z
  3. Para un principiante de git, no es obvio cuál es la diferencia entre las dos últimas opciones (--soft y la que está arriba). Mencionar el índice no ayuda, todavía no sabemos qué significa eso. ¡La conexión de @ nessur entre soft y Ctrl-Z realmente ayudó! Pero todavía no entiendo muy bien la diferencia entre las dos opciones.
    2012-06-26 15: 56: 52Z
  4. Es mucho mejor que se le diga 'por qué' algo funciona, que solo se le diga la respuesta. Felicitaciones a esta descripción: ayudó a ser 'get' git.
    2012-07-03 19: 13: 35Z
  5. Falta un punto crucial: si dicha confirmación fue 'enviada' al control remoto, cualquier operación de 'deshacer', no importa lo simple que sea, causará un enorme dolor y sufrimiento. para el resto de los usuarios que tienen esta confirmación en su copia local, cuando hacen un 'git pull' en el futuro. Por lo tanto, si la confirmación ya estaba 'empujada', haga esto en su lugar: git revert < bad-commit-sha1-id > origen de git push:
    2013-11-08 23: 43: 18Z

Esto me tomó un tiempo entenderlo, así que quizás esto ayude a alguien ...

Hay dos formas de "deshacer" su último compromiso, dependiendo de si ya ha hecho público su compromiso (enviado a su repositorio remoto):

Cómo deshacer un commit local

Digamos que me comprometí localmente, pero ahora quiero eliminar ese compromiso.

 
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 de nuevo a la forma en que estaba antes de la última confirmación, necesitamos reset para la confirmación 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 se ha eliminado nuestro último compromiso.

Cómo deshacer un compromiso público

Si ya ha hecho públicos sus confirmaciones, querrá crear una nueva confirmación que "revertirá" los cambios realizados en su confirmación anterior (HEAD actual).

 
git revert HEAD

Sus cambios ahora se revertirán y estarán listos para que los confirme:

 
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 obtener más información, consulte Conceptos básicos de Git - Deshacer cosas

    
1966
2018-01-30 23: 27: 24Z
  1. He encontrado que esta respuesta es la más clara. git revert HEAD^ no es el anterior, es el anterior del anterior. Lo hice: git revert HEAD y luego empujé de nuevo y funcionó :)
    2011-07-14 08: 32: 53Z

Agrega /elimina archivos para obtener las cosas de la forma que deseas:

 
git rm classdir
git add sourcedir

Luego modifica el compromiso:

 
git commit --amend

La confirmación errónea anterior se editará para reflejar el nuevo estado del índice; en otras palabras, será como si nunca hubiera cometido el error en primer lugar.

Tenga en cuenta que solo debe hacer esto si aún no ha empujado. Si ha presionado, entonces solo tendrá que confirmar un arreglo normalmente.

    
1685
2016-10-12 06: 45: 55Z
  1. ¿Funciona cuando hice un git commit --amend y lo que realmente quería hacer es un git commit?
    2011-05-18 13: 07: 31Z
  2. @ dbm, si modificó accidentalmente, use git reset --soft <oldref>, donde oldref es el ID de confirmación antes de la modificación. Puede utilizar git reflog para identificar el antiguo ID de confirmación. Esto deshará los efectos de la modificación, pero dejará los cambios en escena. Luego simplemente haga git commit para cometer como un compromiso regular.
    2011-05-18 14: 20: 48Z
  3. @ Dennis, git commit --amend convierte el árbol actual (es decir, cambios por etapas) en un commit, sobrescribiendo HEAD actual. Después de ese punto, ya no se consideran por etapas porque son parte del commit (es decir, , git diff --cached está en blanco), pero no están "eliminados" o "perdidos".
    2012-02-01 03: 08: 06Z
  4. ¡La opción --amend fueron los trucos, para evitar un compromiso falso!
    2019-03-22 19: 58: 29Z
 
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 a los archivos .java (y cualquier otro archivo) que quisieras confirmar.

El hard reset al HEAD-1 establecerá su copia de trabajo en el estado de confirmación antes de su confirmación incorrecta.

    
954
2017-12-13 22: 03: 28Z
  1. "- hard" eliminará los archivos .java modificados en el directorio de trabajo que quería confirmar.
    2009-05-29 18: 26: 59Z
  2. Puedes "git stash save" cambios de copia de trabajo, hacer un restablecimiento completo y luego "git stash pop" para recuperarlos, aunque supongo que sería un restablecimiento de software más simple.
    2011-04-15 13: 33: 03Z
  3. git commit -a -m "" o git commit -am "" naturalmente! :]
    2014-06-21 16: 31: 59Z
  4. Otro uso 'abreviado' de stash; si desea desarticular todo (deshacer git add), solo git stash, luego git stash pop
    2015-12-08 22: 30: 29Z

Para cambiar la última confirmación

Reemplaza los archivos en el índice:

 
git rm --cached *.class
git add *.java

Luego, si se trata de una sucursal privada, modifique la confirmación:

 
git commit --amend

O, si se trata de una rama compartida, haga una nueva confirmación:

 
git commit -m 'Replace .class files with .java files'


( para cambiar un compromiso anterior , use el impresionante rebase interactivo )


ProTip ™: agregue *.class a un gitignore para evitar que esto vuelva a suceder.


Para revertir un commit

Modificar una confirmación es la solución ideal si necesita cambiar la última confirmación, pero una solución más general es reset.

Puedes restablecer git a cualquier confirmación con:

 
git reset @~N

Donde N es el número de confirmaciones anteriores a HEAD, y @~ se restablece a la confirmación anterior.

Entonces, en lugar de modificar el compromiso, puedes usar:

 
git reset @~
git add *.java
git commit -m "Add .java files"

Echa un vistazo a git help reset, específicamente las secciones en --soft --mixed y --hard, para una mejor comprensión de lo que hace esto.

Reflog

Si se equivoca, siempre puede usar el reflog para encontrar confirmaciones eliminadas:

 
$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


    
724
2017-05-23 12: 03: 09Z
  1. Para aquellos que lean en el futuro, tenga en cuenta que git revert es un comando independiente, que básicamente "restablece" un solo commimt.
    2018-08-08 07: 11: 00Z

Utilice git revert <commit-id>

Para obtener el ID de confirmación, solo use git log

    
612
2018-11-10 09: 36: 11Z
  1. Si confirmó en la rama incorrecta: una vez revertido, cambie a la correlaciónct branch y cherry-pick el commit.
    2012-06-27 11: 02: 58Z
  2. ¿Qué significa eso, selecciona el compromiso? En mi caso, estaba en la rama incorrecta cuando edité un archivo. Lo cometí y luego me di cuenta de que estaba en la rama equivocada. El uso de "git reset --soft HEAD ~ 1" me devolvió justo antes de la confirmación, pero ahora si compruebo la rama correcta, ¿cómo deshago los cambios en el archivo de la rama incorrecta pero los hago (en el mismo nombre? archivo) en la rama correcta?
    2015-01-13 22: 05: 57Z
  3. Acabo de utilizar git revert commit-id, funcionó a la perfección. Por supuesto, entonces tendrá que impulsar sus cambios.
    2016-01-25 21: 07: 16Z
  4. Creo que sería git cherry-pick <<erroneous-commit-sha>> @astronomerdave. De, el Sr. Casi 2 años tarde en la fiesta.
    2016-10-20 18: 19: 50Z
  5. @ Kris: En lugar de usar rebase, seleccione la opción. Porque es una selección avanzada de cerezas
    2018-11-10 09: 38: 58Z

Si planea deshacer un compromiso local por completo, cualquier cambio que haya hecho en el compromiso, y si no se preocupa por eso, simplemente haga el siguiente comando.

 
git reset --hard HEAD^1

(Este comando ignorará su compromiso completo y sus cambios se perderán completamente de su árbol de trabajo local). Si desea deshacer su confirmación, pero desea que se realicen cambios en el área de preparación (antes de la confirmación, como después de git add), ejecute el siguiente comando.

 
git reset --soft HEAD^1

Ahora sus archivos comprometidos entran en el área de preparación. Supongamos que si desea actualizar los archivos, porque necesita editar algún contenido incorrecto, realice el siguiente comando

 
git reset HEAD

Ahora los archivos confirmados deben provenir del área apilada al área sin apilar Ahora los archivos están listos para editar, por lo que, independientemente de lo que cambie, desea editarlo y agregarlo, y realizar un nuevo /nuevo compromiso.

Más

    
494
2018-09-28 08: 43: 59Z
  1. @ SMR, en su ejemplo, todos apuntan solo a HEAD actual. CABEZA ^ = CABEZA ^ 1. Además de HEAD ^ 1 = HEAD ~ 1. Cuando usa HEAD ~ 2, hay una diferencia entre los símbolos ~ y ^. Si usa ~ 2 significa "el primer padre del primer padre" o "el abuelo".
    2015-12-14 15: 34: 11Z

Si tiene Git Extras instalado, puede ejecutar git undo para deshacer el último compromiso. git undo 3 deshará las últimas 3 confirmaciones.

    
466
2011-12-13 10: 18: 31Z

Quería deshacer las últimas 5 confirmaciones en nuestro repositorio compartido. Busqué el ID de revisión al que quería revertir. Luego escribí lo siguiente.

 
prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>
    
433
2012-04-06 13: 58: 52Z
  1. Reescribir el historial en un repositorio compartido es generalmente una muy mala idea. Supongo que sabes lo que estás haciendo, solo espero que los futuros lectores también lo hagan.
    2012-12-07 16: 02: 12Z
  2. Sí, la reversión es peligrosa. Asegúrese de que su copia de trabajo esté en el estado deseado antes de empujar. Cuando se empuja eln las confirmaciones no deseadas se eliminan permanentemente.
    2012-12-08 14: 14: 43Z
  3. "Al igual que en el mundo real, si desea reescribir la historia, necesita una conspiración: todos deben participar en la conspiración (al menos todos los que sabe sobre la historia, es decir, todos los que alguna vez han sacado de la rama) ". Fuente: stackoverflow.com/a/2046748/334451
    2013-08-07 10: 10: 25Z

Prefiero usar git rebase -i para este trabajo, porque aparece una buena lista donde puedo elegir los compromisos para deshacerme de ellos. Puede que no sea tan directo como algunas otras respuestas aquí, pero simplemente se siente bien .

Elija la cantidad de confirmaciones que desea enumerar, luego invoque así (para enlistar las últimas tres)

 
git rebase -i HEAD~3

Lista de muestra

 
pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Luego, Git eliminará las confirmaciones de cualquier línea que elimines.

    
412
2018-12-06 21: 59: 20Z

Cómo corregir el compromiso local anterior

Use git-gui (o similar) para realizar un git commit --amend. Desde la GUI puede agregar o eliminar archivos individuales de la confirmación. También puede modificar el mensaje de confirmación.

Cómo deshacer el compromiso local anterior

Simplemente restablezca su sucursal a la ubicación anterior (por ejemplo, usando gitk o git rebase). Luego vuelva a aplicar los cambios de una copia guardada. Después de la recolección de basura en su repositorio local, será como si el compromiso no deseado nunca hubiera ocurrido. Para hacer todo eso en un solo comando, use git reset HEAD~1.

Palabra de advertencia : El uso descuidado de git reset es una buena manera de hacer que su copia de trabajo se encuentre en un estado confuso. Recomiendo que los novatos de Git eviten esto si pueden.

Cómo deshacer un compromiso público

Realice una selección de cereza invertida ( git-revert ) para deshacer los cambios.

Si aún no ha introducido otros cambios en su sucursal, simplemente puede hacer ...

 
git revert --no-edit HEAD

Luego coloque su rama actualizada en el repositorio compartido.

El historial de confirmación mostrará ambas confirmaciones, por separado .


Avanzado: corrección de la rama privada en el repositorio público

Esto puede ser peligroso; asegúrate de tener una copia local de la sucursal para volver a utilizarla.

También tenga en cuenta: no desea hacer esto si alguien más puede estar trabajando en la sucursal.

 
git push --delete (branch_name) ## remove public version of branch

Limpie su sucursal localmente y luego vuelva a lanzar ...

 
git push origin (branch_name)

En el caso normal, probablemente no deba preocuparse de que su historial de confirmación de sucursal privada sea prístino. Simplemente presione una confirmación de seguimiento (vea 'Cómo deshacer una confirmación pública' más arriba), y más adelante, haga una squash-merge para ocultar el historial.

    
398
2018-12-07 05: 57: 27Z
  1. gitk --all $(git reflog | cut -c1-7)& puede ser útil para encontrar la revisión anterior si desea deshacer un compromiso '--amend' '.
    2014-10-18 23: 38: 11Z
  2. Se debe tener en cuenta que si está intentando eliminar información secreta antes de ingresar a un repositorio compartido, hacer una reversión no lo ayudará, ya que la información seguirá siendo válida. Estar en la historia en el commit anterior. Si desea asegurarse de que el cambio nunca sea visible para otras personas, debe usar git reset
    2015-09-04 04: 52: 01Z
  3. 2016-04-05 04: 20: 04Z
  4. Creo que 'privado' /'público' sería más correctamente 'local' /'remoto'.
    2018-03-28 14: 59: 27Z
  5. La corrección de una sucursal privada en el repositorio remoto también se puede realizar simplemente mediante git push origin (branch_name) --force
    2018-09-07 12: 09: 38Z

Si ha cometido correo no deseado pero no lo ha enviado,

 
git reset --soft HEAD~1
  

HEAD ~ 1 es una abreviatura para la confirmación antes de head. Alternativamente, puede consultar el SHA-1 del hash si desea restablecerlo. La opción --soft eliminará la confirmación, pero dejará todos los archivos modificados "Cambios por confirmar", como lo pondría el estado de git.

     

Si desea deshacerse de cualquier cambio en los archivos rastreados en el árbol de trabajo, ya que la confirmación antes de la cabeza use " --hard " en su lugar.

O

  

Si ya presionaste y alguien tiró, lo que generalmente es mi caso, no puedes usar git reset . Sin embargo, puedes hacer un git revert ,

 
git revert HEAD
  

Esto creará una nueva confirmación que revierte todo lo introducido por la confirmación accidental.

    
319
2014-09-25 07: 58: 25Z
  1. Estoy en el segundo caso, pero cuando hago "git revert HEAD" dice "error: Commit [ID] es una combinación pero no hay una opción -m" dado. fatal: revertido falló ". ¿Alguna sugerencia?
    2014-11-12 19: 36: 02Z
  2. Probablemente vale la pena mencionar que en lugar de HEAD~1 puede usar el hash real tal como se muestra en git log --stat o en git reflog, útil cuando necesita 'deshacer' más de un commit.
    2014-12-07 00: 38: 49Z

    Si desea deshacerlo permanentemente y ha clonado algún repositorio

    El ID de confirmación puede ser visto por

     
    git log 
    

    Entonces puedes hacer -

     
    git reset --hard <commit_id>
    
    git push origin <branch_name> -f
    
        
    316
    2015-06-24 09: 34: 15Z
    1. ¿Qué ocurre si no usas "< commit_id >" y simplemente use "git reset - hard"? Por lo general, solo quiero deshacerme de mis últimas actualizaciones que aún no he confirmado y he vuelto a la última confirmación que hice, y siempre uso "git reset - hard".
      2017-09-27 23: 30: 18Z
    2. @ JaimeMontoya Para deshacer los cambios más recientes, puede usar git reset --hard, pero si tiene que eliminar la última "n" confirme que especifica un SHA
      2017-09-28 13: 10: 31Z

    En SourceTree (GUI para GitHub), puede hacer clic con el botón derecho en la confirmación y hacer una 'Confirmación inversa '. Esto debería deshacer tus cambios.

    En la terminal:

    También puedes usar:

     
    git revert
    

    O:

     
    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 your changes.
    
        
    269
    2015-06-24 09: 34: 11Z

    Un solo comando:

     
    git reset --soft 'HEAD^' 
    

    ¡Funciona muy bien deshacer el último compromiso local!

        
    250
    2014-07-21 20: 13: 34Z
    1. Necesitaba escribir git reset --soft "HEAD ^" con comillas dobles, porque lo escribo desde el símbolo del sistema de Windows.
      2014-04-23 09: 13: 35Z
    2. Debería funcionar sin comillas.
      2016-11-10 19: 19: 44Z

    Simplemente reinícielo con el comando siguiente usando git:

     
    git reset --soft HEAD~1
    

    Explique: lo que hace git reset, es básicamente reset para cualquier confirmación a la que le gustaría volver, luego, si la combina con la tecla --soft, volverá, pero mantendrá los cambios su (s) archivo (s), por lo que vuelve a la etapa en la que se acaba de agregar el archivo, HEAD es el jefe de la rama y, si combina con ~1 (en este caso, también usa HEAD^), volverá solo una confirmación que lo que quieras ...

    Creo los pasos en la imagen a continuación con más detalles, incluidos todos los pasos que pueden suceder en situaciones reales y confirmando el código:

     ¿Cómo deshacer las últimas confirmaciones en Git?

        
    241
    2017-10-27 12: 46: 34Z

    ¿Cómo deshacer el último commit de Git?

    Para restaurar todo de nuevo a la forma en que estaba antes de la última confirmación, debemos restablecer la confirmación antes de HEAD.

    1. Si no desea mantener los cambios que realizó:

       
      git reset --hard HEAD^
      
    2. Si desea mantener sus cambios:

       
      git reset --soft HEAD^
      

    Ahora revisa tu registro de git. Mostrará que nuestro último compromiso se ha eliminado.

        
    223
    2017-03-25 08: 14: 01Z

    Use reflog para encontrar un estado correcto

     
    git reflog
    

    reflog before REFLOG ANTES DE REINICIAR

    Seleccione el reflog correcto (f3cb6e2 en mi caso) y escriba

     
    git reset --hard f3cb6e2
    

    Después de eso, el repositorio HEAD se restablecerá a ese HEADid reset effect REGISTRO DESPUÉS DE LA RESTAURACIÓN

    Finalmente, el reflog se parece a la imagen de abajo

    reflog after REFLOG FINAL

        
    180
    2014-01-06 22: 34: 06Z

    "Restablecer el árbol de trabajo a la última confirmación"

     
    git reset --hard HEAD^ 
    

    "Limpiar archivos desconocidos del árbol de trabajo"

     
    git clean    
    

    vea - Referencia rápida de Git

    NOTA: este comando eliminará tu confirmación anterior, ¡así que usa con precaución! git reset --hard es más seguro -

        
    173
    2017-12-13 22: 04: 48Z

    Primera ejecución:

     
    git reflog
    

    Le mostrará todas las acciones posibles que ha realizado en su repositorio, por ejemplo, cometer, fusionar, extraer, etc.

    Entonces haz:

     
    git reset --hard ActionIdFromRefLog
    
        
    156
    2015-06-24 09: 33: 20Z

    Deshacer último compromiso:

    git reset --soft HEAD^ o git reset --soft HEAD~

    Esto deshará la última confirmación.

    Aquí, --soft significa restablecer en la puesta en escena.

    HEAD~ o HEAD^ significa moverse para confirmar antes de HEAD.


    Reemplazar la última confirmación para la nueva confirmación:

     
    git commit --amend -m "message"
    

    Reemplazará la última confirmación con la nueva confirmación.

        
    148
    2017-12-13 22: 05: 20Z

    Otra forma:

    Compruebe la sucursal que desea revertir, luego restablezca su copia de trabajo local para volver a la confirmación de que desea ser la última en el servidor remoto (todo lo que suceda después se irá adiós). Para hacer esto, en SourceTree hice clic derecho en y seleccioné "Restablecer BRANCHNAME a este compromiso".

    Luego navegue hasta el directorio local de su repositorio y ejecute este comando:

     
    git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
    

    Esto borrará todas las confirmaciones después de la actual en tu repositorio local, pero solo para esa rama.

        
    143
    2015-06-24 09: 34: 21Z

    Escriba git log y busque el último código hash de confirmación y luego ingrese:

     
    git reset <the previous co>
    
        
    134
    2015-06-24 09: 34: 18Z

    En mi caso, accidentalmente cometí algunos archivos que no quería. Así que hice lo siguiente y funcionó:

     
    git reset --soft HEAD^
    git rm --cached [files you do not need]
    git add [files you need]
    git commit -c ORIG_HEAD
    

    Verifique los resultados con gitk o git log --stat

        
    130
    2015-06-24 09: 34: 09Z

    Simple, ejecuta esto en tu línea de comando:

     
    git reset --soft HEAD~ 
    
        
    121
    2016-01-18 21: 58: 33Z

    Hay muchas maneras de hacerlo:

    Git comando para deshacer la última confirmación /confirmaciones anteriores:

    Advertencia: No usar - difícilmente si no sabes lo que estás haciendo. --hard es demasiado peligroso , y podría eliminar tus archivos.

    El comando básico para revertir la confirmación en Git es:

     
    $ git reset --hard <COMMIT -ID>
    

    o

     
    $ git reset --hard HEAD~<n>
    

    COMMIT-ID : ID para la confirmación

    n: es el número de las últimas confirmaciones que desea revertir

    Puede obtener el ID de confirmación como se muestra a continuación:

     
    $ **git log --oneline**
    
    d81d3f1 function to subtract two numbers
    
    be20eb8 function to add two numbers
    
    bedgfgg function to mulitply two numbers
    

    donde d81d3f1 y be20eb8 son ID de confirmación.

    Ahora veamos algunos casos:

    Supongamos que desea revertir la última confirmación 'd81d3f1'. Aquí hay dos opciones:

     
    $ git reset --hard d81d3f1
    

    o

     
    $ git reset --hard HEAD~1
    

    Supongamos que desea revertir la confirmación 'be20eb8':

     
    $ git reset --hard be20eb8
    

    Para obtener información más detallada, puede consultar y probar otros comandos también para restablecer la cabeza a un estado específico:

     
    $ git reset --help
    
        
    119
    2018-08-19 14: 00: 16Z
    1. git reset --hard HEAD~1 es demasiado peligroso ! Esto no solo "cancelará la última confirmación", sino que revertirá el repositorio completamente a la confirmación anterior. ¡Así que LOJARÁ todos los cambios confirmados en el último compromiso!
      2017-03-21 12: 09: 47Z
    2. Tiene razón, para deshacer esto puede usar git push -f <remote> HEAD@{1}:<branch>
      2017-04-24 13: 07: 03Z
    3. Desafortunadamente, uso --hard, ¡y mis archivos se eliminan! No revisé el comentario primero porque está colapsado. ¡No use - hard si no sabe lo que está haciendo!
      2018-08-19 13: 53: 17Z

    Para un compromiso local

     
    git reset --soft HEAD~1
    

    o si no recuerda exactamente en qué compromiso se encuentra, puede usar

     
    git rm --cached <file>
    

    Para un compromiso empujado

    La forma correcta de eliminar archivos del historial del repositorio es usar git filter-branch. Es decir,

     
    git filter-branch --index-filter 'git rm --cached <file>' HEAD
    

    Pero te recomiendo que uses este comando con cuidado. Lea más en git-filter-branch (1) Página de manual .

        
    117
    2014-07-21 20: 15: 08Z

    Hay dos escenarios principales

    Aún no has empujado la confirmación

    Si el problema fueron los archivos adicionales que comprometió (y no quiere que estén en el repositorio), puede eliminarlos usando git rm y luego comprometiéndose con --amend

     
    git rm <pathToFile>
    

    También puedes eliminar directorios completos con -r, o incluso combinarlos con otros Bash comandos

     
    git rm -r <pathToDirectory>
    git rm $(find -name '*.class')
    

    Después de eliminar los archivos, puede confirmar, con la opción --amend

     
    git commit --amend -C HEAD # the -C option is to use the same commit message
    

    Esto reescribirá su reciente confirmación local eliminando los archivos adicionales, por lo tanto, estos archivos nunca se enviarán en modo push y también serán eliminados de su repositorio .git local por GC.

    Ya presionaste el commit

    Puede aplicar la misma solución del otro escenario y luego hacer git push con la opción -f, pero no se recomienda ya que sobrescribe el historial remoto con un cambio divergente (puede desordenar su repositorio ).

    En su lugar, debe realizar la confirmación sin --amend (recuerde esto acerca de -amend`: esa opción reescribe el historial de la última confirmación).

        
    117
    2016-01-11 23: 50: 47Z

    Para restablecer la revisión anterior, eliminar de forma permanente todos los cambios no confirmados:

     
    git reset --hard HEAD~1
    
        
    117
    2016-09-16 07: 25: 01Z
    1. Tal vez podría, en una nota /advertencia, que su comando elimine el commit y los cambios en el directorio de trabajo sin pedir más.
      2014-11-24 22: 35: 29Z
    2. 2014-11-24 22: 40: 57Z
    3. Use --soft para mantener sus cambios como uncommitted changes, --hard para eliminar completamente la confirmación y revertirla en uno. Recuerde realizar dichas operaciones solo en los cambios, que aún no se han enviado.
      2015-03-09 09: 11: 06Z
    4. @ Zaz: Tienes razón; tal vez debería haber aclarado eso. Solo los archivos /cambios que se hayan agregado al índice (/staged) o que se hayan confirmado se podrán recuperar. Los cambios no comprometidos, no programados son , como usted dijo, eliminados completamente por git reset --hard.
      2016-09-13 21: 17: 10Z
    5. Como una nota al margen: cada vez que se almacena un archivo, git almacena su contenido en su base de datos de objetos. Los contenidos almacenados solo se eliminan cuando se ejecuta la recolección de basura. Por lo tanto, es posible recuperar la última versión preparada de un archivo que no se almacenó actualmente cuando se ejecutó git reset --hard (consulte las publicaciones vinculadas anteriormente para obtener más información).
      2016-09-13 21: 22: 52Z
fuente colocada aquí