¿Cómo deshacer los commits más recientes en Git?

Accidentalmente confié archivos incorrectos a Git , pero todavía no he enviado la confirmación al servidor.

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

    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 árbol de trabajo (el estado de sus archivos 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 mensaje de confirmación 1 , podría usar git reset --soft HEAD~ 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 de árbol de trabajo.
    4. git add todo lo que quieras incluir en tu nueva confirmación.
    5. Confirme los cambios, reutilizando el mensaje de confirmación anterior. reset copiado el encabezado anterior 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 .

    Sin embargo, tenga en cuenta que 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 tiene permisos para sobrescribir el historial (rebase), entonces:

     git push origin master --force 

    También puedes mirar esta respuesta:

    ¿Cómo mover HEAD a una ubicación anterior? (Cabeza separada)

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


    1 Tenga en cuenta, sin embargo, que no necesita reiniciar a 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 eclipsar cualquier cambio que haya realizado desde entonces) y luego git commit --amend , que abrirá su editor de mensajes de confirmación predeterminado git commit --amend previamente con el último mensaje de confirmación.

    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 archivos.

      (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 archivos 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 menos que use --hard ) deja sus archivos 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 archivos y su índice :

     git reset --soft HEAD~1 

    Esto no solo deja tus archivos solos, incluso deja tu índice solo. Cuando hagas el git status , verás que los mismos archivos están en el índice como antes. De hecho, justo después de este comando, 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 lista 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.

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

    Hay dos formas 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í localmente, 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 don't need commit 100: adding a file that we need 

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

    Agregue / elimine archivos para obtener 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 cuenta que solo debe hacer esto si aún no lo ha hecho. Si presionó, entonces tendrá que comprometerse normalmente.

     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 desee confirmar.

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

    Para cambiar el último compromiso

    Reemplace 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 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 base de datos 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 obtener 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 comando.

     git reset --hard HEAD^1 

    (Este comando ignorará todo su compromiso y sus cambios se perderán por completo de su árbol 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 comando.

     git reset --soft HEAD^1 

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

     git reset HEAD 

    Ahora los archivos comprometidos provienen del área montada en el área sin grabar. Ahora los archivos 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 lista 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 alistar 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á los 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 archivos individuales de la confirmación. También puede modificar el mensaje de confirmación.

    Cómo deshacer el compromiso local anterior

    Simplemente reinicie su sucursal a la ubicación anterior (por ejemplo, usando gitk o git rebase ). Luego vuelva a aplicar sus cambios desde una copia 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 comando, use git reset HEAD~1 .

    Palabra de advertencia : el uso descuidado del git reset de git reset es una buena manera de poner su copia 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.

    El historial de confirmaciones mostrará ambas confirmaciones, por separado .


    Avanzado: corrección de una sucursal privada en un repository público

    Esto puede ser peligroso, asegúrese de tener una copia local de la twig para repusar.

    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 twig localmente y luego repulse …

     git push origin (branch_name) 

    En el caso normal, probablemente no tengas que preocuparte de que tu historial de commit de la twig privada sea prístino. Simplemente presione una confirmación de seguimiento (consulte ‘Cómo deshacer una confirmación pública’ más arriba), y luego, realice una combinación de squash para ocultar el historial.

    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 archivos modificados “Cambios que se comprometerán”, como lo indicaría el estado de git.

    Si desea deshacerse de cualquier cambio en los archivos rastreados en el árbol 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  git push origin  -f 

    En SourceTree (GUI para GitHub), puede hacer clic con el botón 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 comando:

     git reset --soft 'HEAD^' 

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

    Simplemente reinícielo haciendo el siguiente comando 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) archivo (s), por lo que vuelve al escenario donde acaba de agregarse el archivo, 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 imagen 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?

    ¿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 registro 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 imagen siguiente

    volver a escribir después REFLOG FINAL

    “Restablecer el árbol de trabajo al último compromiso”

     git reset --hard HEAD^ 

    “Limpiar archivos desconocidos del árbol de trabajo”

     git clean 

    ver – Referencia rápida de Git

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

    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 

    De otra manera:

    Verifique la sucursal que desea revertir, luego restablezca su copia de trabajo local de nuevo a la confirmación que desea que sea la última en el servidor 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 directorio local de tu repository y ejecuta este comando:

     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.

    Deshacer 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.

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

     git reset  

    En mi caso, cometí accidentalmente algunos archivos 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 registro de gitk o git –stat

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

    Hay dos escenarios principales

    Aún no has empujado el compromiso

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

     git rm  

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

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

    Después de eliminar los archivos, 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 archivos adicionales, por lo tanto, estos archivos 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).

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

     git reset --soft HEAD~ 

    Hay muchas formas de hacerlo:

    El comando Git para deshacer el último commit / commit anterior:

    Advertencia: No use –duro si no sabe lo que está 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  

    o

     $ git reset --hard HEAD~ 

    COMMIT-ID : ID para la confirmación

    n: es el número de últimos commit 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 el último commit ‘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 algunos otros comandos también para restablecer el encabezado a un estado específico:

     $ git reset --help 

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

     git reset --hard HEAD~1