Restablece todos los cambios después de la última confirmación en git

324

¿Cómo puedo deshacer cada cambio realizado en mi directorio después de la última confirmación, incluida la eliminación de archivos agregados, restablecer archivos modificados y volver a agregar archivos eliminados?

Dogbert
fuente
posible duplicado de Revertir a Git commit anterior
nawfal
8
@nawfal puede ser un duplicado, pero 'restablecer todos los cambios después de la última confirmación' coincide con más criterios de búsqueda (palabras buscadas en google) que el correspondiente 'cómo revertir el repositorio de git'. Al menos para personas como yo que no tienen el inglés como lengua materna: d
Shirish Herwade

Respuestas:

561

Primero reinicie los cambios

git reset HEAD --hard

luego limpie todo sin seguimiento. Si desea mantener los archivos que no se rastrean debido a .gitignore, tenga cuidado con este comando.

git clean -fd
Benjamin Bannier
fuente
77
@ Adam: es posible que a veces también desee la -xopción git clean, que lo dirige a eliminar también los archivos ignorados.
Cascabel
31
Si desea mantener archivos que no se rastrean debido a .gitignore, tenga cuidado con el git clean -fdcomando.
bitsoflogic
3
@Levinaris: es al revés git clean -fd, no eliminará los archivos ignorados. -xserá.
Robert Siemer
55
@RobertSiemer En realidad, ¡puede! Si tiene carpetas compuestas completamente de archivos ignorados, eliminará esas carpetas y eliminará los archivos ignorados. Considere un archivo .gitignore como el que se encuentra aquí: stackoverflow.com/q/25554504/456645 . En este ejemplo, suponga que algunas carpetas no tienen archivos PHP. git clean -fdeliminará esas carpetas y archivos sin seguimiento. Probado con git versión 1.9.1
bitsoflogic
3
pero ¿por qué se necesita la segunda "limpieza"?
Shirish Herwade
71

¿Cómo puedo deshacer cada cambio realizado en mi directorio después de la última confirmación, incluida la eliminación de archivos agregados, restablecer archivos modificados y volver a agregar archivos eliminados?

  1. Puede deshacer los cambios en los archivos rastreados con:

    git reset HEAD --hard
    
  2. Puede eliminar archivos sin seguimiento con:

    git clean -f
    
  3. Puede eliminar archivos y directorios sin seguimiento con:

    git clean -fd
    

    pero no puede deshacer el cambio a archivos sin seguimiento .

  4. Puede eliminar archivos y directorios ignorados y no rastreados

    git clean -fdx
    

    pero no puede deshacer el cambio a archivos ignorados .

También puedes configurarlo clean.requireForcepara false:

git config --global --add clean.requireForce false

para evitar usar -f( --force) cuando lo usas git clean.

Ortomala Lokni
fuente
2
Impresionante, justo lo que necesitaba. ¡Gracias por la comparación de todos los comandos relevantes!
Marquee
-1

Hay dos comandos que funcionarán en esta situación,

root> git reset --HAD HEAD ~ 1

root> git push -f

Para más comandos git, consulte esta página

RKS
fuente
1
git push -fno está relacionado con la pregunta y, en este escenario, es peligroso
bigote1up