git: deshacer todos los cambios de directorio de trabajo, incluidos los archivos nuevos

1151

Cómo eliminar todos los cambios del directorio de trabajo, incluidos los nuevos archivos sin seguimiento. Sé que eso git checkout -fhace eso, pero no elimina los nuevos archivos sin seguimiento creados desde la última confirmación.

¿Alguien tiene una idea de cómo hacer eso?

Aler
fuente
1
@Joel & Wayfarer: ¿por qué no lo intentas git help resetygit help clean
SHernandez
3
Hacer un alias para esto en su configuración de git es una buena idea;)
anubina

Respuestas:

1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Para ver lo que se eliminará de antemano, sin eliminarlo realmente, use el -nindicador (esto es básicamente una ejecución de prueba). Cuando esté listo para eliminar, elimine la -nbandera:

git clean -nfd

BKSpurgeon
fuente
16
Nota: git reset --hard elimina los cambios por etapas, así como los cambios en el directorio de trabajo. Además, git clean -f -d es probablemente un mejor opuesto a la adición de un nuevo archivo sin seguimiento. A partir de la pregunta, el autor de la pregunta puede estar bastante contento con su conjunto actual de archivos ignorados.
CB Bailey
77
Lee la siguiente respuesta y ten cuidado con el modificador -x. (También puede eliminar su configuración local, como archivos de contraseña / configuración de base de datos. Por ejemplo, database.yml)
Boris
99
Ese cambio -x es innecesario y algo peligroso en este caso.
Tim Gautier
66
git clean -fxden realidad puede ser REALMENTE peligroso si no sabes lo que estás haciendo. Puede terminar eliminando permanentemente algunos archivos no rastreados muy importantes, como su base de datos, etc. Tenga cuidado.
Mason Stewart
10
Tenga en cuenta que git clean -f -dtambién eliminará los archivos de las carpetas ignoradas. Así que todos los registros locales y cosas así se habrán ido. Por lo general, no es un gran problema, pero es mejor saberlo.
cyriel
299

Método más seguro, que uso con frecuencia:

git clean -fd

Explicación de sintaxis según la /docs/git-cleanpágina:

  • -f(alias:) --force. Si la variable de configuración de Git clean.requireForce no está establecida en false, git clean se negará a eliminar archivos o directorios a menos que se indique -f, -n o -i. Git se negará a eliminar directorios con el subdirectorio o archivo .git a menos que se dé una segunda -f.
  • -d. Elimine los directorios sin seguimiento además de los archivos sin seguimiento. Si un directorio no rastreado es administrado por un repositorio Git diferente, no se elimina de manera predeterminada. Use la opción -f dos veces si realmente desea eliminar dicho directorio.

Como se mencionó en los comentarios, puede ser preferible hacer una git clean -ndejecución en seco y le diga qué se eliminaría antes de eliminarlo.

Enlace a la git cleanpágina del documento: https://git-scm.com/docs/git-clean

Heath Dutton
fuente
124
Siempre git clean -nd .antes de eliminar archivos usandogit clean -fd .
tbear
14
¿Por qué? ¿Puedes explicar los detalles por favor?
Greg B
31
La opción per git clean -n es en realidad una ejecución en seco que no elimina nada, solo muestra lo que se hará.
RNickMcCandless
2
@tbear, siempre puedes hacer un add -A+ commit -a+ en blanco revert headprimero antes git clean. Revisar todas y cada una de las eliminaciones simplemente no escala para los escenarios principales. Además, el funcionamiento en seco no es una bala de plata: ¿qué pasa si se perdió algo o se equivocó durante la revisión?
Pacerier
1
Esto elimina archivos, pero no deshace las modificaciones.
donquixote
202

Para todos los archivos sin clasificar , use:

git checkout -- .

Al .final es importante.

Puede reemplazarlo .con un nombre de subdirectorio para borrar solo un subdirectorio específico de su proyecto. El problema se aborda específicamente aquí .

jfountain
fuente
77
@Vincent: El - evita errores de escritura al decirle al comando de pago que no se especifican más parámetros. ¡Sin ellos, podría terminar con una nueva rama en lugar de restablecer la actual!
Igor Rodriguez
2
Esta es la ruta más segura, pero no eliminará los archivos no rastreados (archivos recién agregados).
TinkerTenorSoftwareGuy
55
Esto no restaura los archivos eliminados, pero no confirmados.
Cerin
Solo para tu información. Me perdí esto. Asegúrese de estar en el directorio donde desea eliminar los cambios no organizados. Por ejemplo, tuve cambios en 2 archivos diferentes en diferentes ubicaciones en una rama, es decir: src/app/work/filename.jsy ../app/working/test/filename.js. Solo el uso git checkout -- .en la rama solo eliminó el primer archivo ( sin los principales ../ ). Así que tuve que cd ../subir al segundo directorio de ubicación para eliminar el segundo archivo usando ese comando.
Chris22
57

Echa un vistazo al git cleancomando.

git-clean - Elimina archivos no rastreados del árbol de trabajo

Limpia el árbol de trabajo mediante la eliminación recursiva de archivos que no están bajo control de versiones, comenzando desde el directorio actual.

Normalmente, solo se eliminan los archivos desconocidos para git, pero si se especifica la opción -x, también se eliminan los archivos ignorados. Esto puede, por ejemplo, ser útil para eliminar todos los productos de compilación.

Greg Hewgill
fuente
Intenté git clean -iy elegí "limpiar" del menú, esto finalmente eliminó los archivos nuevos.
Sany
43

Los siguientes trabajos:

git add -A .
git stash
git stash drop stash@{0}

Tenga en cuenta que esto descartará los cambios locales no organizados y organizados. Por lo tanto, debe confirmar todo lo que desee conservar antes de ejecutar estos comandos.

Un caso de uso típico: movió muchos archivos o directorios, y luego desea volver al estado original.

Créditos: https://stackoverflow.com/a/52719/246724

Don Quijote
fuente
1
¿Por qué hace referencia a stash @ {0} en lugar de solo git stash drop?
maikel
Honestamente, no lo recuerdo :)
donquixote
Este funcionó. Como nota, asegúrese de estar en el directorio de inicio ( git add -A .). He perdido 30 millones porque no hubo coincidencia de archivos. ¡Gracias!
user9869932
Solía ​​usar este enfoque, y tiene mérito. Sin embargo, desde entonces he encontrado las soluciones propuestas por jfountain y Heath Dutton más aptas para el problema original, en mi humilde opinión.
HeyZiko
2
git stash drop stash @ {0} suelta la última reserva si hiciste git stash, dejaría caer todas las reservas que hiciste
DonatasD
42

Puedes hacer esto en dos pasos:

  1. Revertir archivos modificados: git checkout -f
  2. Eliminar archivos sin seguimiento: git clean -fd
Gerard de Visser
fuente
3
+1 porque simple. También porque funciona y hace exactamente lo que OP quiere sin asustarlos con omg, esto eliminará todo.
geekzster
30

Pensé que era ( advertencia: siguiente será arrasar con todo )

$ git reset --hard HEAD
$ git clean -fd

El resetpara deshacer cambios. La cleaneliminar cualquier untracked f iles y d irectories.

skube
fuente
Esto no funciona, todavía recibo una advertencia de conflicto cuando hago un git pulldespués: CONFLICT (content): Merge conflict in...solo lo resolví por ungit pull --strategy=ours
rubo77
7
git reset --hard origin/{branchName}

Eliminará todos los archivos no rastreados.

santosh kumar
fuente
4

git clean -iprimero le mostrará los elementos que se eliminarán y continuará después de su confirmación. Esto me resulta útil cuando se trata de archivos importantes que no deben eliminarse accidentalmente.

Consulte git help cleanpara obtener más información, incluidas algunas otras opciones útiles.

Taiga
fuente
4

Si desea descartar todos los cambios, puede usar cualquiera de las opciones válidas en un alias en .gitconfig. Por ejemplo:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Uso: git discard

Agorreca
fuente
1
Este alias me gusta mucho
marca el
3

Una solución alternativa es confirmar los cambios y luego deshacerse de esos cambios. Al principio, esto no tiene un beneficio inmediato, pero abre la posibilidad de comprometerse en fragmentos y crear una etiqueta git para la copia de seguridad.

Puedes hacerlo en la rama actual, así:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

O puede hacerlo con la CABEZA separada. (suponiendo que comience en la rama BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Sin embargo, lo que suelo hacer es comprometerme en fragmentos, luego nombrar algunos o todos los confirmados como "DESCARTAR: ...". Luego, use rebase interactivo para eliminar los commits malos y conservar los buenos.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Esto es más detallado, pero permite revisar exactamente qué cambios desea descartar.

Los atajos git lolygit lola han sido muy útiles con este flujo de trabajo.

Don Quijote
fuente
3

Para una carpeta específica que utilicé:

git checkout -- FolderToClean/*
Glauco Neves
fuente
3
Eso no elimina los archivos no rastreados, como dice OP.
vonbrand
0

Esta es probablemente una respuesta novata, pero: uso TortoiseGit para Windows y tiene una buena característica llamada REVERT. Entonces, lo que debe hacer para revertir sus cambios locales no escalonados no acelerados es:

  1. muestre un menú contextual para la carpeta necesaria y seleccione revertir, muestra una ventana emergente de reversión donde puede seleccionar los archivos modificados para revertir / recuperar.
  2. Si también desea eliminar los archivos agregados (que aún no están en git), haga clic en confirmar (desde el mismo menú contextual), aparecerá la ventana emergente Confirmar y le mostrará los archivos agregados, luego haga clic con el botón derecho en cada uno de ellos y elija eliminar. Pero no presione Confirmar btn en esta ventana emergente, ya que no desea confirmar, solo vea los archivos agregados y elimínelos desde aquí.
Oleg Vorontsov
fuente