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


Accidentalmente cometí archivos incorrectos para Git, pero aún no envié la confirmación al servidor.

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


17793
2017-07-28 22:22


origen


Respuestas:


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 el compromiso y deja los cambios que ha cometido sin procesar (para que aparezcan como "Cambios no realizados para la confirmación" en git status, y deberá agregarlos nuevamente antes de comprometerse). Si tu solamente querer añadir más cambios en la confirmación anterior, o cambie el mensaje de confirmación1, podrías usar git reset --soft HEAD~ en cambio, que es como git reset HEAD~ (dónde 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 cualquier cosa que desee incluir en su nueva confirmación.
  5. Confirme los cambios, reutilizando el mensaje de confirmación anterior. reset copiado la cabeza vieja 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 -C opción.

Sin embargo, tenga en cuenta que si ha agregado nuevos cambios al índice, use commit --amend los agregará a su compromiso 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 te 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 compromiso. La opción más fácil es git reset (para eclipsar cualquier cambio que haya hecho desde entonces) y luego git commit --amend, que abrirá su editor de mensajes de confirmación predeterminado rellenado previamente con el último mensaje de confirmación.


19231
2018-06-16 17:27



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)
A-B-C
    ↑
  master

Tú quieres Nuke comete C y nunca más vuelvas a verlo. Tu hiciste esto:

git reset --hard HEAD~1

El resultado es:

 (F)
A-B
  ↑
master

Ahora B es la CABEZA. Porque usaste --hard, tus archivos se restablecen a su estado en commit B.

Ah, pero supongamos que cometer C no fue un desastre, sino un poco apagado. Tú quieres deshacer la confirmación, pero mantener sus cambios para un poco de edición antes de hacer un mejor compromiso. Comenzando de nuevo desde aquí, con C como su CABEZA:

   (F)
A-B-C
    ↑
  master

Puedes hacer esto, dejando 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 al último commit. Cuando haces 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) dejas tus archivos como estaban. Y ahora git status muestra los cambios que habías registrado en C. ¡No has perdido nada!

Para el toque más ligero, puedes incluso deshacer su compromiso, 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 tu lo hagas git status, verá 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 compromiso 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, hay todavía una forma de recuperarlo Tipo git reflog y verás una lista de confusiones (parciales) en las que te has movido. Encuentra la confirmación que destruiste 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.


9725
2018-05-29 18:16



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 repositorio 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 del último compromiso, necesitamos reset a la confirmación antes 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 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 '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, echa un vistazo Fundamentos de Git: deshacer las cosas


1744
2018-05-29 18:13



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.


1623
2017-07-31 09:39



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 la .java archivos (y cualquier otro archivo) que quisiera confirmar.

los hard reset a HEAD-1 configurará su copia de trabajo al estado de la confirmación antes de su confirmación incorrecta.


875
2018-05-25 16:04



Para cambiar el último compromiso

Reemplace los archivos en el índice:

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

Entonces, si se trata de una sucursal privada, enmendar el compromiso:

git commit --amend

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

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


(para cambiar un compromiso anteriorusa el impresionante rebase interactivo)


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


Para revertir un commit

La modificación de un compromiso es la solución ideal si necesita cambiar el último compromiso, pero una solución más general es reset.

Puede restablecer git a cualquier confirmación con:

git reset @~N

Dónde N es el número de confirmaciones antes HEADy @~ se 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"

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

Reflog

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

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



677
2018-01-31 07:06



Utilizar git revert commit-id

Para obtener la identificación de compromiso, solo use git log


547
2017-12-13 10:18



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 compromiso, pero desea los cambios en el área de ensayo (antes de confirmar como después git add) luego haz 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


440
2018-04-06 13:58



Si usted tiene Git Extras instalado, puedes ejecutar git undo para deshacer el último compromiso. git undo 3 deshace los últimos 3 commits.


430
2017-10-25 03:41



Quise deshacer las últimas 5 confirmaciones en nuestro repositorio 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 [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

398



Prefiero usar git rebase -i para este trabajo, porque una buena lista aparece donde puedo elegir los compromisos para deshacerse de. Puede que no sea tan directo como algunas otras respuestas aquí, pero solo 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.


380