¿Cómo deshacer los últimos commits en Git?

Hice por crash los files incorrectos en Git , pero aún no envié la confirmación al server.

¿Cómo puedo deshacer esos commits?

Deshacer un commit 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 sin modificar su tree de trabajo (el estado de sus files en el disco), pero deshace la confirmación y deja los cambios que ha cometido sin procesar (para que aparezcan como "Cambios no configurados para la confirmación" en git status , y tendrá que agréguelos nuevamente antes de cometer). Si solo desea agregar más cambios a la confirmación anterior, o cambiar el post de confirmación 1 , podría usar git reset --soft HEAD~ lugar, que es como git reset HEAD~ pero deja los cambios existentes en etapas.
  3. Haga correcciones a los files de tree de trabajo.
  4. git add todo lo que quieras include en tu nueva confirmación.
  5. Confirme los cambios, reutilizando el post de confirmación anterior. reset copydo el encabezado anterior a .git/ORIG_HEAD ; commit con -c ORIG_HEAD abrirá un editor, que inicialmente contiene el post de logging de la confirmación anterior y le permite editarlo. Si no necesita editar el post, puede usar la opción -C .

1 Tenga en count, sin embargo, que no necesita reiniciar a una confirmación anterior si acaba de cometer un error en su post de confirmación . La opción más fácil es git reset (para eclipsar cualquier cambio que haya realizado desde entonces) y luego git commit --amend , que abrirá su editor de posts de confirmación pnetworkingeterminado git commit --amend previamente con el último post de confirmación.

Sin embargo, tenga en count que si ha agregado nuevos cambios al índice, el uso de commit --amend los agregará a su confirmación anterior.

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

Digamos que tiene esto, donde C es su CABEZA y (F) es el estado de sus files.

  (F) ABC ↑ master 

Desea activar nukear C y nunca volver a verlo . Tu hiciste esto:

 git reset --hard HEAD~1 

El resultado es:

  (F) AB ↑ master 

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

Ah, pero supongamos que cometer C no fue un desastre, sino un poco apagado. Desea deshacer la confirmación, pero conserve sus cambios para un poco de edición antes de realizar una mejor confirmación. Comenzando de nuevo desde aquí, con C como su CABEZA:

  (F) ABC ↑ master 

Puedes hacer esto, dejando fuera el --hard :

 git reset HEAD~1 

En este caso, el resultado es:

  (F) ABC ↑ master 

En ambos casos, HEAD es solo un puntero al último commit. Cuando hagas un git reset HEAD~1 , le dices a Git que mueva el puntero HEAD hacia atrás una vez. Pero (a less que use --hard ) deja sus files como estaban. Entonces, el git status muestra los cambios que habías registrado en C. ¡No has perdido nada!

Para el toque más ligero, incluso puede deshacer su confirmación, pero deje sus files y su índice :

 git reset --soft HEAD~1 

Esto no solo deja tus files solos, incluso deja tu índice solo. Cuando hagas el git status , verás que los mismos files están en el índice como antes. De hecho, justo después de este command, podrías hacer git commit y estarías rehaciendo el mismo commit que acabas de tener.

Una cosa más: supongamos que destruyes un compromiso como en el primer ejemplo, pero luego descubres que lo necesitabas después de todo . Mala suerte, ¿verdad?

No, todavía hay una manera de recuperarlo. Escribe git reflog y verás una list de confianzas (parciales) en las que te has movido. Encuentra la confirmación que has destruido y haz esto:

 git checkout -b someNewBranchName shaYouDestroyed 

Ahora has resucitado ese compromiso. En realidad, los compromisos no se destruyen en Git durante unos 90 días, por lo que normalmente puedes volver atrás y rescatar uno del que no quisiste deshacerse.

Agregue / elimine files para get las cosas de la manera que desee:

 git rm classdir git add sourcedir 

A continuación, modifique la confirmación:

 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 hubieras cometido el error en primer lugar.

Tenga en count que solo debe hacer esto si aún no lo ha hecho. Si presionó, entonces tendrá que comprometerse normalmente.

Esto me llevó un time descubrirlo, así que tal vez esto ayude a alguien …

Hay dos forms de "deshacer" su última confirmación, dependiendo de si ya ha hecho público su compromiso (enviado a su repository remoto):

Cómo deshacer un compromiso local

Digamos que me comprometí a nivel local, pero ahora quiero eliminar esa confirmación.

 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, debemos reset 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 el git log mostrará que nuestro último compromiso ha sido eliminado.

Cómo deshacer un compromiso público

Si ya has hecho tus confirmaciones públicas, querrás crear una nueva confirmación que "revertirá" los cambios que hiciste en tu confirmación anterior (HEAD actual).

 git revert HEAD 

Sus cambios ahora serán revertidos y listos para que pueda comprometerse:

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

Para get más información, echa un vistazo a Fundamentos de Git – Deshacer cosas

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

o

 git reset --hard HEAD~1 

Advertencia: el command anterior eliminará permanentemente las modificaciones a los files .java (y cualquier otro file) que desee confirmar.

El restablecimiento completo de HEAD-1 configurará su copy de trabajo en el estado de la confirmación antes de la confirmación incorrecta.

Para cambiar el último compromiso

Reemplace los files 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 bien, si se trata de una twig compartida, realice una nueva confirmación:

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

( para cambiar una confirmación anterior , use la increíble database interactiva )


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


Para revertir un commit

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

Puede restablecer git a cualquier confirmación con:

 git reset @~N 

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

Entonces, en lugar de modificar la confirmación, podrías usar:

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

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

Reflog

Si te equivocas, siempre puedes usar el reflog para encontrar commits descartados:

 $ 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 

Utilice git revert commit-id

Para get la ID de confirmación, solo usa git log

Si está planeando deshacer por completo una confirmación local, haga lo que cambie en la confirmación, y si no se preocupa por eso, simplemente haga el siguiente command.

 git reset --hard HEAD^1 

(Este command ignorará todo su compromiso y sus cambios se perderán por completo de su tree de trabajo local). Si desea deshacer su confirmación, pero desea los cambios en el área de preparación (antes de confirmar al igual que después de git add ), realice el siguiente command.

 git reset --soft HEAD^1 

Ahora sus files comprometidos entran en el área de preparación. Supongamos que si quiere dejar de grabar los files, porque necesita editar algún error, haga el siguiente command

 git reset HEAD 

Ahora los files comprometidos provienen del área montada en el área sin grabar. Ahora los files están listos para editar, por lo que sea lo que sea que cambie, quiere ir a editar y agregarlo y hacer una nueva / nueva confirmación.

Más

Si tienes Git Extras instalado, puedes ejecutar git undo para deshacer la última confirmación. git undo 3 deshace los últimos 3 commits.

Quise deshacer las últimas 5 confirmaciones en nuestro repository compartido. Busqué la ID de revisión a la que quería deshacer. 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> 

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

Elija la cantidad de confirmaciones que desea enumerar, luego invoque de esta manera (para alistr 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á commits de cualquier línea que elimines.

Cómo corregir el compromiso local anterior

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

Cómo deshacer el compromiso local anterior

Simplemente reinicie su sucursal a la location anterior (por ejemplo, usando gitk o git rebase ). Luego vuelva a aplicar sus cambios desde una copy guardada. Después de la recolección de basura en su repository local, será como si la confirmación no deseada nunca hubiera sucedido. Para hacer todo eso en un solo command, use git reset HEAD~1 .

Palabra de advertencia : el uso descuidado del git reset de git reset es una buena manera de poner su copy de trabajo en un estado confuso. Recomiendo que los principiantes de Git eviten esto si pueden.

Cómo deshacer un compromiso público

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

Si aún no ha realizado otros cambios en su sucursal, simplemente puede hacer …

 git revert --no-edit HEAD 

A continuación, inserte su twig actualizada en el repository compartido.

Si has cometido basura pero no has sido empujado,

 git reset --soft HEAD~1 

HEAD ~ 1 es una abreviatura de la confirmación antes de la cabeza. Como alternativa, puede consultar el SHA-1 del hash si desea restablecerlo. –la opción suave eliminará la confirmación, pero dejará todos los files modificados "Cambios que se comprometerán", como lo indicaría el estado de git.

Si desea deshacerse de cualquier cambio en los files rastreados en el tree de trabajo desde la ejecución antes de la cabeza use " hard " en su lugar.

O

Si ya presionó y alguien tiró, que generalmente es mi caso, no puede 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.

Si desea deshacerlo permanentemente y ha clonado algún repository

La identificación de confirmación puede ser vista por

 git log 

Entonces puedes hacer –

 git reset --hard <commit_id> git push origin <branch_name> -f 

En SourceTree (GUI para GitHub), puede hacer clic con el button derecho en la confirmación y hacer un 'Compromiso Inverso'. Esto debería deshacer sus cambios.

En la terminal:

Puede usar alternativamente:

 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. 

Un solo command:

 git reset --soft 'HEAD^' 

¡Funciona de maravilla para deshacer el último compromiso local!

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

Para restablecer todo de nuevo al estado anterior a 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 mira tu logging de git. Mostrará que nuestro último compromiso ha sido eliminado.

Use el reflog para encontrar un estado correcto

 git reflog 

reflog antes REFLOGAR ANTES DE RESTABLECER

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

 git reset --hard f3cb6e2 

Después de eso, la HEAD repo se restablecerá a ese HEADid efecto de reinicio REGISTRO DESPUÉS DE RESTA

Finalmente, el reflog se parece a la image siguiente

volver a escribir después REFLOG FINAL

Simplemente reinícielo haciendo el siguiente command usando git :

 git reset --soft HEAD~1 

Explique: lo que hace el git reset , básicamente se reset a cualquier confirmación al que le gustaría volver, luego, si lo combina con la tecla --soft , retrocederá, pero conservará los cambios en su (s) file (s), por lo que vuelve al escenario donde acaba de agregarse el file, HEAD es el encabezado de la twig y si combina con ~1 (en este caso también usa HEAD^ ), se devolverá solo una confirmación, que es lo que desea. ..

Creo los pasos en la image a continuación con más detalles para usted, incluidos todos los pasos que pueden ocurrir en situaciones reales y la confirmación del código:

¿Cómo deshacer los últimos commits en Git?

Primer bash:

 git reflog 

Le mostrará todas las acciones posibles que haya realizado en su repository, por ejemplo, commit, merge, pull, etc.

Entonces hazlo:

 git reset --hard ActionIdFromRefLog 

"Restablecer el tree de trabajo al último compromiso"

 git reset --hard HEAD^ 

"Limpiar files desconocidos del tree de trabajo"

 git clean 

ver – Referencia rápida de Git

NOTA: Este command eliminará su confirmación anterior, ¡entonces use con precaución! git reset –hard es más seguro –

De otra manera:

Verifique la sucursal que desea revertir, luego restablezca su copy de trabajo local de nuevo a la confirmación que desea que sea la última en el server remoto (todo después de que se vaya a despedir). Para hacer esto, en SourceTree I hice clic derecho en y seleccioné "Reset BRANCHNAME a este compromiso".

Luego navega al directory local de tu repository y ejecuta este command:

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

Esto borrará todas las confirmaciones posteriores a la actual en su repository local, pero solo para esa twig.

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

 git reset <the previous co> 

En mi caso, cometí accidentalmente algunos files que no quería. Entonces 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 

Verificar los resultados con el logging de gitk o git –stat

Hay dos escenarios principales

Aún no has empujado el compromiso

Si el problema fueron los files adicionales que haya enviado (y no los quiere en el repository), puede eliminarlos usando git rm y luego --amend con --amend

 git rm <pathToFile> 

También puede eliminar directorys completos con -r , o incluso combinarlos con otros commands Bash

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

Después de eliminar los files, puede confirmar, con la opción –mendar

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

Esto reescribirá su confirmación local reciente eliminando los files adicionales, por lo tanto, estos files nunca se enviarán al momento y también serán eliminados de su repository .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 arruinar su repository).

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

Deshace la última confirmación: –

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

Esto deshace el último commit.

Aquí --soft significa reiniciar en puesta en escena.

HEAD~ o HEAD^ significa moverse para comprometerse antes que HEAD.


Reemplazar el último compromiso por un nuevo compromiso:

 git commit --amend -m "message" 

Reemplazará el último commit con el nuevo commit.

Use SourceTree (herramienta gráfica para Git) para ver sus commits y tree. Puede restablecerlo manualmente directamente haciendo clic con el button derecho.

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

 git reset --soft HEAD~ 

Para restablecer a la revisión anterior, eliminar permanentemente todos los cambios no confirmados:

 git reset --hard HEAD~1 

Este artículo tiene una excelente explicación sobre cómo abordar varios escenarios (donde se ha realizado una confirmación así como la inserción O solo una confirmación, antes del envío):

http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html

Del artículo, el command más fácil que vi para revertir una confirmación previa por su identificación de confirmación , era:

 git revert dd61ab32