Cómo eliminar una gran cantidad de archivos sin eliminar el contenido
Accidentalmente agregué muchos archivos temporales usandogit add -A
Logré eliminar los archivos usando los siguientes comandos y logré eliminar el índice sucio.
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Los comandos anteriores se enumeran en el archivo git help rm
. Pero, lamentablemente, mis archivos también se eliminaron durante la ejecución, a pesar de que había dado la opción de caché. ¿Cómo puedo borrar el índice sin perder el contenido?
También sería útil si alguien pudiera explicar cómo funciona esta operación de tubería.
git reset
Si todo lo que quieres es deshacer una ejecución demasiado entusiasta de "git add":
git reset
Sus cambios no se realizarán y estarán listos para que los vuelva a agregar como desee.
NO CORRA git reset --hard
.
No sólo eliminará los archivos agregados, sino que también revertirá cualquier cambio que haya realizado en su directorio de trabajo. Sin embargo , si creó algún archivo nuevo en el directorio de trabajo, no los eliminará.
Si tiene un repositorio impecable (o HEAD no está configurado) [1], simplemente puede
rm .git/index
Por supuesto, esto requerirá que vuelvas a agregar los archivos que deseabas agregar .
[1] Tenga en cuenta (como se explica en los comentarios) que esto generalmente solo sucedería cuando el repositorio es nuevo ("prístino") o si no se han realizado confirmaciones. Más técnicamente, siempre que no haya caja ni árbol de trabajo.
Solo lo dejo más claro :)
actualización 2019
Como lo señalaron otros en preguntas relacionadas (consulte aquí , aquí , aquí , aquí , aquí , aquí, aquí y aquí ), ahora puede eliminar la etapa de un archivo con git restore --staged <file>
.
Para eliminar todos los archivos de su proyecto, ejecute lo siguiente desde la raíz del repositorio (el comando es recursivo):
git restore --staged .
Si solo desea eliminar los archivos en un directorio, navegue hasta él antes de ejecutar lo anterior o ejecute:
git restore --staged <directory-path>
Notas
git restore
se introdujo en julio de 2019 y se lanzó en la versión 2.23.
Con la--staged
bandera restaura el contenido del árbol de trabajo desde HEAD (por lo que hace lo contrariogit add
y no elimina ningún cambio).Este es un comando nuevo, pero el comportamiento de los comandos antiguos permanece sin cambios. Entonces, las respuestas anteriores con
git reset
ogit reset HEAD
siguen siendo perfectamente válidas.Cuando se ejecuta
git status
con archivos preparados no confirmados, esto es ahora lo que Git sugiere usar para eliminar los archivos (en lugar degit reset HEAD <file>
como solía hacerlo antes de v2.23).