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

21065

Accidentalmente cometí los archivos incorrectos en Git , pero aún no he enviado la confirmación al servidor.

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

Peter Mortensen
fuente
138
Antes de publicar una nueva respuesta, considere 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.
Sazzad Hissain Khan
9191
¿Sabes qué git necesita? git undo, Eso es. Entonces, la reputación que tiene Git por manejar los errores cometidos por nosotros, simples mortales, desaparece. Implemente presionando el estado actual en una pila git antes de ejecutar cualquier gitcomando. Afectaría el rendimiento, por lo que sería mejor agregar un indicador de configuración para habilitarlo.
Yimin Rong
11
@YiminRong Eso se puede hacer con la aliasfunción de Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric
3
@RomainValeri: la misma forma de deshacer funciona en cualquier otro lugar.
Yimin Rong
1
@YiminRong No lo compra. La gente todavía tantearía y deshacería cosas para no deshacerlas. Pero lo que es más importante, git reflogya está cerca de lo que describe, pero le da al usuario más control sobre lo que se debe (des) hacer. Pero, por favor, no, "deshacer" no funciona de la misma manera en todas partes, y la gente esperaría muchas cosas diferentes para lograr la función. ¿Deshacer la última confirmación? ¿Deshacer la última acción? Si la última acción fue un empuje, ¿deshacer cómo exactamente (restablecer y empujar) o (revertir y empujar)?
RomainValeri

Respuestas:

22863

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 no hace nada a su árbol de trabajo (el estado de sus archivos en el disco), pero deshace la confirmación y deja los cambios que confirmó sin clasificar (por lo que aparecerán como "Cambios no organizados para la confirmación" git status, por lo que deberá agréguelos nuevamente antes de comprometerse). Si solo desea agregar más cambios a la confirmación anterior, o cambiar el mensaje de confirmación 1 , puede usar git reset --soft HEAD~en su lugar, que es como git reset HEAD~2 pero deja los cambios existentes en escena.
  3. Haga correcciones a los archivos del árbol de trabajo.
  4. git add todo lo que quieras incluir en tu nueva confirmación.
  5. Confirme los cambios, reutilizando el antiguo mensaje de confirmación. resetcopiado la vieja cabeza a .git/ORIG_HEAD; commitwith -c ORIG_HEADabrirá un editor, que inicialmente contiene el mensaje de registro del antiguo commit y le permite editarlo. Si no necesita editar el mensaje, puede usar la -Copción.

Sin embargo, tenga en cuenta que si agregó nuevos cambios al índice, el uso commit --amendlos 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 ver esta respuesta:

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

La respuesta anterior le mostrará git reflog,cuál se utiliza para averiguar qué es el SHA-1, que desea revertir. Una vez que encuentre el punto en el que desea deshacer, use la secuencia de comandos como se explicó anteriormente.


1 Tenga en cuenta, sin embargo, que no necesita restablecer una confirmación anterior si solo cometió un error en su mensaje de confirmación . La opción más fácil es git reset(desestabilizar cualquier cambio que haya realizado 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.

2 HEAD~ es lo mismo que HEAD~1. Además, vea ¿Cuál es la CABEZA en git? . Es útil si desea deshacer múltiples confirmaciones.

Mark Amery
fuente
472
Y si la confirmación fue a la rama incorrecta, puede git checkout theRightBranchcon todas las etapas de cambios. Como solo tenía que hacer.
Frank Shearar
491
Si está trabajando en DOS, en lugar de git reset --soft HEAD^eso deberá usarlo git reset --soft HEAD~1. El ^ es un carácter de continuación en DOS, por lo que no funcionará correctamente. Además, --softes el valor predeterminado, por lo que puede omitirlo si lo desea y simplemente decirlo git reset HEAD~1.
Ryan Lundy
119
los usuarios de zsh pueden obtener: zsh: no matches found: HEAD^- necesita escapar ^ es decirgit reset --soft HEAD\^
tnajdek
77
La respuesta no es correcta si, por accidente, git commit -ase emitió cuando -adebería haberse dejado de lado. En ese caso, es mejor no omitir --soft(lo que dará como resultado --mixedcuál es el valor predeterminado) y luego puede reestablecer los cambios que pretendía cometer.
dmansfield
66
@IcyBrk git add es un comando. git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786
10734

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

Desea destruir nuclearmente C y nunca volver a verlo y perder todos los cambios en los archivos modificados localmente . Tu hiciste 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 commit B.

Ah, pero supongamos que cometer C no fue un desastre, sino un poco extraño. Desea deshacer la confirmación, pero mantenga los cambios para editar un poco antes de realizar una confirmación mejor. Comenzando de nuevo desde aquí, con C como su CABEZA:

   (F)
A-B-C
    ↑
  master

Puedes hacer esto, dejando de lado --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 confirmación. Pero (a menos que lo use --hard) deja sus archivos como estaban. Así que ahora git statusmuestra los cambios que has registrado en C. ¡No has perdido nada!

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

git reset --soft HEAD~1

Esto no solo deja sus archivos solos, sino que también deja solo su índice . Cuando lo haga git status, verá que los mismos archivos están en el índice que antes. De hecho, justo después de este comando, podría hacer git commity estaría rehaciendo la misma confirmación que acaba de tener.

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

No, todavía hay una manera de recuperarlo. Escriba git reflogy verá una lista de commits (parciales) (es decir, hashes) en los que se ha movido. Encuentre el commit que destruyó y haga lo siguiente:

git checkout -b someNewBranchName shaYouDestroyed

Ahora has resucitado ese compromiso. Los commits en realidad no se destruyen en Git durante unos 90 días, por lo que generalmente puede regresar y rescatar uno del que no quiso deshacerse.

Ryan Lundy
fuente
15
¡TENER CUIDADO! ¡Esto podría no hacer lo que espera si su confirmación errónea fue una fusión (avance rápido)! Si su cabeza está en una confirmación de fusión (ej .: entidad de rama fusionada en maestra), git reset --hard~1apuntará la rama maestra a la última confirmación dentro de la rama de característica. En este caso, se debe usar la ID de confirmación específica en lugar del comando relativo.
Chris Kerekes
90
Falta un punto crucial: si dicha confirmación se 'empujó' previamente al control remoto, cualquier operación de 'deshacer', por simple que sea, causará un enorme dolor y sufrimiento al resto de los usuarios que tienen esta confirmación en su copia local, cuando hacen un 'git pull' en el futuro. Entonces, si el commit ya estaba 'empujado', haga esto en su lugar: git revert <bad-commit-sha1-id> git push origin:
FractalSpace
12
@FractalSpace, no causará "dolor y sufrimiento enormes". He hecho algunos empujones de fuerza cuando uso Git con un equipo. Todo lo que se necesita es comunicación.
Ryan Lundy el
14
@ Kyralessa En mi lugar de trabajo, desordenar el flujo de trabajo de todo el equipo y luego decirles cómo solucionar sh * t no se llama 'comunicación'. git history re-write es una operación destructiva que resulta en la destrucción de partes del repositorio. Insistir en su uso, mientras hay alternativas claras y seguras disponibles, es simplemente irresponsable.
FractalSpace
14
Quería bombardear un commit y nunca volver a verlo. Utilicé tu ejemplo con, --hardpero no me di cuenta de que todos mis cambios no organizados en mi árbol de trabajo también se ven afectados. Iba a confirmar estos archivos como parte de una confirmación posterior. Ahora parece imposible recuperar estos archivos; incluso probé la solución sobre la que publicaste, reflogpero esto no restauró los cambios previamente no organizados.
Adam Burley
2130

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

Cómo deshacer una confirmación 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 a la forma en que estaba antes de la última confirmación, necesitamos resetconfirmar 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 logmostrará que nuestro último commit ha sido eliminado.

Cómo deshacer un compromiso público

Si ya ha hecho públicos sus commits, querrá crear un nuevo commit que "revertirá" los cambios que realizó en su commit anterior (HEAD actual).

git revert HEAD

Tus cambios ahora se revertirán y estarán listos para que los confirmes:

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 .

Andrés
fuente
101
Encontré esta respuesta la más clara. git revert HEAD^no es lo anterior, es lo anterior de lo anterior. Lo hice: git revert HEADy luego
presioné
Si Git te pregunta "¿Más?" cuando pruebe estos comandos, use la sintaxis alternativa en esta respuesta: stackoverflow.com/a/14204318/823470
tar
1745

Agregue / elimine archivos para obtener las cosas de la manera que desee:

git rm classdir
git add sourcedir

Luego modifique el commit:

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 presionado. Si ha presionado, solo tendrá que cometer una solución normalmente.

bdonlan
fuente
2
FYI: Esto elimina todos mis archivos y perdí los cambios.
egorlitvinenko
UPD: Sin embargo, lo he restaurado usando reflog. Pero el recibo no funcionó para la confirmación inicial.
egorlitvinenko
1
¡Use git rm --cachedpara mantener los archivos en el sistema de archivos y solo elimínelos del índice git!
xuiqzy
1017
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 .javaarchivos (y cualquier otro archivo) que desea confirmar.

El hard resetto HEAD-1establecerá su copia de trabajo al estado de la confirmación antes de su confirmación incorrecta.

Lennart Koopmann
fuente
19
git commit -a -m ""o git commit -am ""naturalmente! :]
trejder
Otro uso de 'atajo' de alijo; si quieres destrabar todo (deshacer git add), solo git stash, entoncesgit stash pop
seanriordan08
778

Para cambiar la última confirmación

Reemplace los archivos en el índice:

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

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

git commit --amend

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

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


( Para cambiar una confirmación anterior , use la impresionante rebase interactiva ).


ProTip ™: agregue *.classa un gitignore para evitar que esto vuelva a ocurrir


Para revertir una confirmación

Enmendar un commit es la solución ideal si necesita cambiar el último commit, pero es una solución más general reset.

Puede restablecer Git a cualquier confirmación con:

git reset @~N

¿Dónde Nestá el número de confirmaciones antes HEADy@~ restablece a la confirmación anterior.

Entonces, en lugar de modificar la confirmación, puede usar:

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

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

Reloguear

Si comete un error, siempre puede usar el registro para buscar confirmaciones descartadas:

$ 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


Zaz
fuente
2
Para aquellos que leen en el futuro, tenga en cuenta que se git reverttrata de un comando separado, que básicamente 'restablece' un solo mensaje.
BKSpurgeon
682

Uso git revert <commit-id>.

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

Jaco Pretorius
fuente
15
¿Qué significa eso, Cherry elegir el compromiso? En mi caso, estaba en la rama equivocada 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 reviso la rama correcta, ¿cómo deshago los cambios en el archivo en la rama incorrecta sino que los hago (en el mismo nombre archivo) en la rama correcta?
astrónomo el
Acabo de utilizar git revert commit-idtrabajado como un encanto. Por supuesto, entonces deberá impulsar sus cambios.
Casey Robinson el
8
Creo que sería git cherry-pick <<erroneous-commit-sha>>@astronomerdave. De, Sr. Casi 2 años tarde a la fiesta.
Tom Howard
@Kris: en lugar de elegir cereza, usa rebase. Porque es una cosecha de cerezas avanzada
Eugen Konkov
Usaría revertir solo si ya he empujado mi commit. De lo contrario, restablecer es una mejor opción. No olvide que revertir crea una nueva confirmación, y generalmente este no es el objetivo.
Hola Soy Edu Feliz Navidad
532

Si está planeando deshacer por completo una confirmación local, lo que sea que haya cambiado lo hizo en la confirmación, y si no le preocupa nada de eso, simplemente ejecute el siguiente comando.

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

Ahora los archivos comprometidos provienen del área preparada al área no preparada. Ahora los archivos están listos para editar, así que sea lo que sea que cambie, desea editarlo y agregarlo y hacer una confirmación nueva / nueva.

Más

Madhan Ayyasamy
fuente
13
@SMR, en su ejemplo, todos apuntan solo a HEAD actual. HEAD ^ = HEAD ^ 1. Así como 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".
Madhan Ayyasamy
501

Si tiene instalado Git Extras , puede ejecutar git undopara deshacer la última confirmación. git undo 3deshacerá los últimos tres commits.

nickf
fuente
470

Quería deshacer las últimas cinco confirmaciones en nuestro repositorio compartido. Busqué la identificación de revisión a la que quería retroceder. 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>
neoneye
fuente
25
Reescribir el historial en un repositorio compartido es generalmente una muy mala idea. Asumo que sabes lo que estás haciendo, solo espero que los futuros lectores también lo sepan.
Brad Koch
Sí, la reversión es peligrosa. Asegúrese de que su copia de trabajo esté en el estado deseado antes de presionar. Al presionar, las confirmaciones no deseadas se eliminan permanentemente.
neoneye
66
"Al igual que en el mundo real, si quieres reescribir la historia, necesitas una conspiración: todo el mundo tiene que estar" involucrado "en la conspiración (al menos todos los que conocen la historia, es decir, todos los que alguna vez se han retirado de la rama) ". Fuente: stackoverflow.com/a/2046748/334451
Mikko Rantalainen
440

Prefiero usar git rebase -ipara este trabajo, porque aparece una buena lista donde puedo elegir los commits para eliminar. Puede que no sea tan directo como algunas otras respuestas aquí, pero se siente bien .

Elija cuántas confirmaciones 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 para cualquier línea que elimine.

Steven Penny
fuente
422

Cómo arreglar el commit local anterior

Use git-gui (o similar) para realizar a 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 la confirmación local anterior

Simplemente restablezca su sucursal a la ubicación anterior (por ejemplo, usando gitko git rebase). Luego vuelva a aplicar sus cambios desde una copia guardada. Después de la recolección de basura en su repositorio local, será como si la confirmación no deseada nunca sucediera. Para hacer todo eso en un solo comando, use git reset HEAD~1.

Palabra de advertencia : el uso descuidado de git resetes una buena manera de llevar su copia de trabajo a 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 inversa ( 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

Luego empuje su rama actualizada al repositorio compartido.

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


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

Esto puede ser peligroso: asegúrese de tener una copia local de la rama para repintar.

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

Limpia tu sucursal localmente y repórtala ...

git push origin (branch_name)

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

nobar
fuente
8
gitk --all $(git reflog | cut -c1-7)&puede ser útil para encontrar la revisión anterior si desea deshacer una confirmación '--amend'.
nobar
44
Debe tenerse en cuenta que si está intentando eliminar información secreta antes de ingresar a un repositorio compartido, hacer una reversión no lo ayudará, porque la información aún estará en el historial en la confirmación anterior. Si desea asegurarse de que el cambio nunca sea visible para otros, debe usarlogit reset
Jherico
Creo que 'privado' / 'público' sería más correctamente 'local' / 'remoto'.
nobar
La corrección de una rama privada en el repositorio remoto también se puede hacer simplementegit push origin (branch_name) --force
nobar el
336

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
poorva
fuente
¿Qué sucede si no usa "<commit_id>" y simplemente usa "git reset --hard"? Por lo general, solo quiero deshacerme de mis últimas actualizaciones que aún no he confirmado y volver a la última confirmación que hice, y siempre uso "git reset --hard".
Jaime Montoya
3
@JaimeMontoya Para deshacer los últimos cambios que puede usar git reset --hard, pero si tiene que eliminar por última vez las últimas confirmaciones "n", especifique un SHA
poorva
334

Si ha cometido basura pero no ha presionado,

git reset --soft HEAD~1

HEAD ~ 1 es una abreviatura de commit antes de head. Alternativamente, 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 a confirmar", 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 confirmació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.

santos_mgr
fuente
Estoy en el segundo caso, pero cuando hago "git revert HEAD" dice "error: Commit [ID] es una fusión pero no se dio la opción -m. Fatal: revert falló". ¿Alguna sugerencia?
metaforge
2
Probablemente valga la pena mencionar que en lugar de HEAD~1usted podría usar el hash real como se muestra por git log --stato por git reflog- útil cuando necesita 'deshacer' más de una confirmación.
ccpizza
284

En SourceTree (GUI para GitHub), puede hacer clic derecho en el commit y hacer un 'Reverse Commit'. Esto debería deshacer sus cambios.

En la terminal:

Alternativamente, puede 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.
Varun Parakh
fuente
263

Un solo comando:

git reset --soft 'HEAD^' 

¡Funciona muy bien para deshacer el último compromiso local!

Manish Shrivastava
fuente
11
Necesitaba escribir git reset --soft "HEAD ^" con comillas dobles, porque lo escribí desde el símbolo del sistema de Windows.
Ena
253

Simplemente reinícielo haciendo el siguiente comando usando git:

git reset --soft HEAD~1

Explicar: quégit reset hace, es básicamente reseta cualquier confirmación a la que le gustaría volver, luego, si lo combina con la --softclave, volverá, pero mantendrá los cambios en sus archivos, para que pueda volver al escenario con el que se acaba de agregar el archivo, HEADes el encabezado de la rama y si se combina con ~1(en este caso también se usa HEAD^), solo se devolverá 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?

Alireza
fuente
239

¿Cómo deshacer la última confirmación de Git?

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

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

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

    git reset --soft HEAD^
    

Ahora revise su registro de git. Mostrará que nuestro último commit ha sido eliminado.

Ranjithkumar Ravi
fuente
193

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

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, ¡así que úselo con precaución! git reset --hardEs más seguro.

Ravi_Parmar
fuente
190

Use reflog para encontrar un estado correcto

git reflog

volver a registrar antes REFLOGAR ANTES DE RESTABLECER

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 efecto de reinicio LOG DESPUÉS DE RESET

Finalmente el reflog se parece a la imagen de abajo

volver a registrar después REFLOG FINAL

Shubham Chaudhary
fuente
164

Primer intento:

git reflog

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

Entonces hazlo:

git reset --hard ActionIdFromRefLog
U. Ali
fuente
155

Deshacer la última confirmación:

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

Esto deshacerá la última confirmación.

Aquí --softsignifica restablecer a la puesta en escena.

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


Reemplace la última confirmación por una nueva confirmación:

git commit --amend -m "message"

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

akshay_rahar
fuente
153

De otra manera:

Verifique la rama que desea revertir, luego restablezca su copia de trabajo local de nuevo a la confirmación de que desea ser la última en el servidor remoto (todo después de que se vaya adiós). Para hacer esto, en SourceTree hice clic derecho en y seleccioné "Restablecer BRANCHNAME a este commit".

Luego navegue al 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 su repositorio local, pero solo para esa rama.

CommaToast
fuente
144

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

git reset <the previous co>
Peter Mortensen
fuente
139

En mi caso, accidentalmente cometí 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

Verifique los resultados con gitk o git log --stat

egridasov
fuente
133

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

git reset --soft HEAD~ 
ihue
fuente
126

Hay muchas formas de hacerlo:

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

Advertencia: No use --hard si no sabe lo que está haciendo. --hard es demasiado peligroso y podría eliminar tus archivos.

El comando básico para revertir el commit en Git es:

$ git reset --hard <COMMIT -ID>

o

$ git reset --hard HEAD~<n>

ID DE COMPROMISO : ID para el compromiso

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

Puede obtener la identificación 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
usuario3799762
fuente
55
git reset --hard HEAD~1es muy peligroso ! Esto no solo 'cancelará la última confirmación', sino que revertirá el repositorio completamente de nuevo a la confirmación anterior. ¡Así que PERDERÁS todos los cambios comprometidos en la última confirmación!
Arnis Juraga
Tienes razón, para deshacer esto puedes usargit push -f <remote> HEAD@{1}:<branch>
Benny
Desafortunadamente, uso --hard, ¡y mis archivos se eliminan! No revisé el comentario primero porque está colapsado. ¡No use --duro si no sabe lo que está haciendo!
anónimo
125

Para un compromiso local

git reset --soft HEAD~1

o si no recuerda exactamente en qué confirmación se encuentra, puede usar

git rm --cached <file>

Para un compromiso empujado

Se está utilizando la forma correcta de eliminar archivos del historial del repositorio 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 del manual .

geoom
fuente
125

Hay dos escenarios principales.

Aún no has presionado el commit

Si el problema fueron los archivos adicionales que confirmó (y no desea que estén en el repositorio), puede eliminarlos usando git rmy luego confirmando con--amend

git rm <pathToFile>

También puede eliminar directorios completos -ro incluso combinarlos con otros comandos Bash

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 confirmación local reciente 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 local .git por GC.

Ya presionaste el commit

Puede aplicar la misma solución del otro escenario y luego hacerlo git pushcon la -fopción, pero no se recomienda ya que sobrescribe el historial remoto con un cambio divergente (puede dañar su repositorio).

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

dseminara
fuente
125

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

git reset --hard HEAD~1
thestar
fuente
23
Tal vez podría en una nota / advertencia que su comando arrojará la confirmación y los cambios en el directorio de trabajo sin preguntar más.
cr7pt0gr4ph7
66
Sin embargo, si haces esto por accidente, no todo está perdido. Consulte stackoverflow.com/questions/10099258/… , stackoverflow.com/questions/15479501/… y stackoverflow.com/questions/7374069/undo-git-reset-hard/7376959 .
cr7pt0gr4ph7
13
Úselo --softpara mantener sus cambios como uncommitted changes, --hardpara bombardear la confirmación por completo y revertir en uno. Recuerde hacer tales operaciones solo en los cambios, que aún no se hayan presionado.
Yunus Nedim Mehel
@Zaz: Tienes razón; tal vez debería haber aclarado eso. Solo se pueden recuperar los archivos / cambios que se han agregado al índice (/ por etapas) o que se han confirmado. Los cambios no comprometidos y no organizados son , como dijiste, completamente descartados git reset --hard.
cr7pt0gr4ph7
1
Como nota al margen: cada vez que se organiza un archivo, gitalmacena 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 preparó actualmente cuando git reset --hardse ejecutó (consulte las publicaciones vinculadas anteriormente para obtener más información).
cr7pt0gr4ph7