¿Cómo revertir los cambios no confirmados, incluidos los archivos y las carpetas?

1072

¿Existe un comando git para revertir todos los cambios no confirmados en un árbol e índice de trabajo y también para eliminar archivos y carpetas recién creados?

MEM
fuente
1
Bueno, he leído todas las respuestas variadas y difíciles de recordar a continuación, con sus advertencias y casos extremos y "no funcionó si tienes xxx", y me he quedado borrando todo el repositorio, clonándolo para eliminar todos los archivos editados y agregados . También son solo dos comandos. rm -r projectdir; git clone xxx. Para mí, esta es una operación frecuente: echa un vistazo a un repositorio con él, luego desea volver a un pago limpio para poder comenzar a modificarlo. No es genial, pero funciona al 100%. Esperando que algún día agreguen un comando simple para esto.
John Little

Respuestas:

1771

Puede ejecutar estos dos comandos:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd
htanata
fuente
147
Es una buena idea ejecutar 'git clean -nd' para obtener una vista previa de los cambios antes de ejecutar git clean para asegurarse de que no se eliminen los archivos o directorios sin seguimiento que le interesan.
jpw
80
Ahorre a alguien un viaje a los documentos: -f es forzar, -d es eliminar directorios, -n es ejecutar en seco (también --dry-run; mostrar salida sin hacer nada todavía)
Aaron Campbell
12
git clean -ipara un modo interactivo.
Galath
No restableció mis archivos sin clasificar, primero tuve que ponerlos en escena.
Aron Lorincz
44
@IgorGanapolsky Probablemente estés en medio de un conflicto de fusión. Intenta correr git merge --abort.
htanata
555

Si desea revertir los cambios solo en el directorio de trabajo actual, use

git checkout -- .

Y antes de eso, puede enumerar los archivos que se revertirán sin realizar ninguna acción, solo para verificar lo que sucederá, con:

git checkout --
Ramashish Baranwal
fuente
1
Cuando intento esto me sale "error: pathpec '.' no coincide con ningún archivo conocido por git.
Mike K
34
¿Cuál es la diferencia entre esto y git reset --hard?
Felipe Almeida
104
'git reset --hard' deshacerá los cambios por etapas y por etapas, mientras que 'git checkout -'. deshacerá solo los cambios no organizados
divideByZero
Pero si usa el pago y tiene archivos modificados, el cmd devolverá que necesito hacer la fusión, incluso cuando solo necesito revertir estos cambios
Vinicius Monteiro
77
git checkout: simplemente enumerará los archivos que se revertirán (sin acción, solo enumerar). Esto es útil si desea ver qué archivos se verán afectados antes de hacer git checkout -.
Krish Srinivasan
107

Use "git checkout - ..." para descartar cambios en el directorio de trabajo

git checkout -- app/views/posts/index.html.erb

o

git checkout -- *

elimina todos los cambios realizados en los archivos sin etapas en el estado de git, por ejemplo

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb
Zarne Dravitzki
fuente
55
git checkout -- *no funciona para mí a menos que esté en el directorio donde se encuentran los archivos modificados. Para retirar todos los archivos en todo el repositorio, debe hacerlogit checkout -- :/
waldyrious el
En git checkout -- *, la estrella se reemplaza por el Shell, con todos los archivos y directorios en el directorio actual. Por lo tanto, debe ir en subdirectorios. Esto funciona para mi. Pero gracias por resaltar la sintaxis ": /" que parece más limpia en mi opinión.
mcoolive
53

Una forma no trivial es ejecutar estos dos comandos:

  1. git stash Esto moverá tus cambios al alijo, regresándote al estado de HEAD
  2. git stash drop Esto eliminará el último alijo creado en el último comando.
Glumgold
fuente
3
Esto no funciona para cambios no confirmados, solo cambios confirmados.
b0xxed1n
44
Lo he usado para cambios no confirmados y funciona.
Paul D. Eden
77
@ b0xxed1n Stashing se trata de cambios no confirmados, y obviamente funciona para ellos.
TJ
git stash se realizó para guardar los cambios no confirmados para que pudiera ... guardarlos sin comprometerse.
Rob
git stash produce el siguiente error:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky
19
git clean -fd

no ayudó, quedaban nuevos archivos. Lo que hice fue eliminar totalmente todo el árbol de trabajo y luego

git reset --hard

Consulte " ¿Cómo borro mi directorio de trabajo local en git? " Para obtener consejos para agregar la -xopción de limpieza:

git clean -fdx

La marca de nota -x eliminará todos los archivos ignorados por Git, así que tenga cuidado (vea la discusión en la respuesta a la que me refiero).

Fr0sT
fuente
¿Qué es -fdx? "fuerza, directorio y x es?
Adi Prasetyo
El indicador @AdiPrasetyo -x también elimina todos los archivos ignorados; podría ser un efecto no deseado, así que actualicé mi respuesta.
Viernes
Todavía no puedo rebase. Me sale el error: error: Error al fusionar los cambios. El parche falló en 0003 Crear llamada de regreso a La copia del parche que falló se encuentra en:
IgorGanapolsky
13

Creo que puedes usar el siguiente comando: git reset --hard

Josnidhin
fuente
hhmm ... hice eso pero mis archivos siguen ahí. ¿Debo hacer algo después?
MEM
1
git reset solo revierte los cambios no confirmados en el árbol de trabajo. No eliminará los nuevos archivos y carpetas. No estoy seguro de cómo hacer eso con git
Josnidhin
1
Entonces, si cambiamos un directorio del sistema agregando nuevos archivos y carpetas, y luego queremos revertir ese directorio a un estado anterior (sin esos archivos y carpetas), ¿no podemos hacer eso con git? Entonces, ¿lo mejor que podemos hacer es revertir los estados de los archivos? Pero una vez que creamos un archivo, ¿no podemos eliminar ese archivo a menos que lo hagamos manualmente?
MEM
6

Tenga en cuenta que es posible que todavía haya archivos que no parecen desaparecer; es posible que no se hayan editado, pero git podría haberlos marcado como editados debido a cambios en CRLF / LF. Vea si ha realizado algunos cambios .gitattributesrecientemente.

En mi caso, agregué configuraciones CRLF en el .gitattributesarchivo y todos los archivos permanecieron en la lista de "archivos modificados" debido a esto. Cambiar la configuración de .gitattributes los hizo desaparecer.

Robar
fuente
6

Si tiene un cambio no confirmado (solo en su copia de trabajo) que desea revertir a la copia en su última confirmación, haga lo siguiente:

git checkout filename
kgandroid
fuente
Estoy intentando esto después de un no comprometido git rm filename, y no funciona. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets
La solución para deshacer git rmesgit checkout master -- filename
falsePockets
3

Git 2.23 introdujo el git restorecomando para restaurar los archivos del árbol de trabajo.

https://git-scm.com/docs/git-restore

Para restaurar todos los archivos en el directorio actual

git restore.

Si desea restaurar todos los archivos fuente de C para que coincidan con la versión en el índice, puede hacer

git restore '* .c'

El efecto Koju
fuente
1
es git 2.23 , no 2.13
phuclv
2

Puede usar el siguiente comando git que puede revertir todos los cambios no confirmados realizados en su repositorio:

git checkout .

Ejemplo:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean
Haritsinh Gohil
fuente
-2

Usualmente uso esta forma que funciona bien:

mv fold/file /tmp
git checkout fold/file
thinkhy
fuente
Esto es exactamente lo mismo que propuso el tipo con 357 "me gusta". Solo que incluso puede crear una copia de seguridad del archivo recién extraído.
Matthias
-3

Un camino seguro y largo:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete
Jason Lemay
fuente
-3

Utilizar:

git reset HEAD filepath

Por ejemplo:

git reset HEAD om211/src/META-INF/persistence.xml
Aniket
fuente