Retroceder a la última confirmación de git

120

Acabo de hacer un

git commit -m "blah"

luego agregué algunos archivos, ¿cómo deshago y elimino lo que hay en mis archivos actuales que aún no se han agregado / confirmado?

Blankman
fuente
15
no, esto no es lo que pide el OP; está claro que quiere retroceder hasta la última confirmación, no deshacer la última confirmación. no dijo que agregó algunos archivos y luego los comprometió. tan claramente quiere el último compromiso.
Paul
1
Es muy difícil encontrar una respuesta a esta pregunta tan común
Sam

Respuestas:

211

Caveat Emptor : comandos destructivos por delante.

Mitigación : git reflog puede salvarlo si lo necesita.


1) DESHAGA los cambios en el archivo local y MANTENGA su última confirmación

git reset --hard

2) DESHACER los cambios del archivo local y ELIMINAR su última confirmación

git reset --hard HEAD^

3) MANTENGA los cambios del archivo local y ELIMINE su última confirmación

git reset --soft HEAD^
Joe Hanink
fuente
20
Este comando eliminará tu confirmación anterior, ¡así que úsalo con precaución! git reset --hard es más seguro
rudivonstaden
9
WTF está haciendo esto como la respuesta correcta con 36 votos a favor. Acabo de perder un día de trabajo por esto ... porque leí la respuesta, no el comentario. ¡Esta no es la respuesta correcta a la pregunta!
Chris Nevill
1
¡No todo está perdido! Puede hacer git reflog, esto le permitirá ver las confirmaciones que hizo antes del reinicio. A continuación, puede consultar esas confirmaciones
Chris Nevill,
3
Por lo que vale, había interpretado la pregunta del OP como "cómo deshago la confirmación y elimino los archivos actuales", pero era y sigue siendo ambigua. Hubiera entendido de manera diferente si el OP simplemente hubiera dicho "cómo
elimino
2
Git es la antítesis de la declaración de Alan Kay. Las cosas simples deberían ser simples, las cosas complejas deberían ser posibles. ... especialmente de su primera parte. Aún así, gracias por tu respuesta. Eso ayudo.
0xC0000022L
46

Si desea eliminar contenidos y archivos recién agregados que ya están almacenados (por lo tanto, agregados al índice), use:

git reset --hard

Si desea eliminar también su última confirmación (es la que tiene el mensaje "bla"), entonces es mejor usar:

git reset --hard HEAD^

Para eliminar los archivos sin seguimiento (de modo que los archivos nuevos aún no se hayan agregado al índice) y las carpetas, use:

git clean --force -d
Paul Pladijs
fuente
¿git reset --hard HEAD ^ elimina mi última confirmación de forma permanente? como si no pudiera volver a eso?
user137717
parece que "git clean --force -d" también elimina las carpetas .gitignored
Alexey Timokhin
15

git reset --hard forzará al directorio de trabajo a volver a la última confirmación y eliminará los archivos nuevos / modificados.

Empalme
fuente
2
hizo eso, pero los archivos todavía están allí. (los archivos sin seguimiento todavía están allí)
Blankman
en este caso, podría hacer un "git stash"
jacktrade
3
votado a favor porque esta es la única respuesta clara e inequívoca a la pregunta clara e inequívoca del OP.
Paul
4

Puede revertir una confirmación utilizando git revert HEAD^para volver a la penúltima confirmación. También puede especificar la confirmación para revertir usando la identificación en lugar de HEAD ^

Sebastián Oliva
fuente
Esto no "revierte" en el sentido que estás diciendo. Esto crea un compromiso inverso.
Stefan Kendall
4

Si solo desea eliminar el último compromiso, use esto:

git reset HEAD~

funciona como un encanto para mí.

Abhishek saharn
fuente
2
esta es la respuesta exacta a la pregunta
Deniz Kocaboğa
esta debería ser la respuesta aprobada
amiabl
3

Una forma sencilla e infalible de DESHACER los cambios de archivos locales desde la última confirmación es colocarlos en una nueva rama:

git branch changes
git checkout changes
git add .
git commit

Esto deja los cambios en la nueva rama. Regrese a la rama original para encontrarla en la última confirmación:

git checkout master

La nueva rama es un buen lugar para practicar diferentes formas de revertir los cambios sin riesgo de estropear la rama original.

Terje Norderhaug
fuente