¿Cómo eliminar un archivo del índice en git?


356

¿Cómo eliminar un archivo del índice (= área de preparación = caché) sin eliminarlo del sistema de archivos?


55
¿Te refieres a "restablecer lo que había antes" o "eliminar, porque ya no quiero ese archivo"?
Andrew Aylett

En mi caso, es lo mismo porque el archivo no existía antes ...
hcs42

Respuestas:


505

Usted quiere:

git rm --cached [file]

Si omite la --cachedopción, también la eliminará del árbol de trabajo. git rmes un poco más seguro que git reset, porque se le advertirá si el contenido en escena no coincide con la punta de la rama o el archivo en el disco. (Si no es así, debe agregarlo --force).


8
Esto también funciona muy bien, por ejemplo, si accidentalmente registró algunos intermedios de compilación o archivos de configuración locales que no llegaron a su .gitignore; use git rm --cachedpara eliminarlos del repositorio, agregue los archivos o directorios relevantes a .gitignore, organice y confirme normalmente. Se habrán ido del repositorio pero permanecerán intactos en su árbol local, y no los volverá a registrar accidentalmente.
Ionoclast Brigham

22
Esto también elimina el archivo del repositorio (remoto) después de confirmar y presionar.
powder366

66
Esto no lo elimina del índice, sino que lo marca como eliminado en el índice.
JotaBe

44
Es muy probable que esta respuesta sea incorrecta, ya que elimina un archivo del repositorio (como ya se ha mencionado en @ powder366) que no es el resultado previsto.
otomo

1
Esta solución no me funcionó. Marcó el archivo especificado como eliminado y luego lo elimina del repositorio local.
paiego

134

Esto debería mostrar un <archivo> para usted (sin eliminar o modificar el archivo):

git reset <file>

66
Esto elimina el último cambio para el archivo específico, pero lo mantiene en el repositorio (remoto) después de confirmar y presionar.
powder366

1
Esta es la respuesta que estaba buscando. Tenga en cuenta que no tiene que especificar HEAD.
Michael Dorst

Buen punto @MichaelDorst. ¡He actualizado la respuesta para omitir HEAD!
David Underhill, el

3
git reset HEAD <file> 

para eliminar un archivo particular del índice.

y

git reset HEAD

para eliminar todos los archivos indexados.


1

Dependiendo de su flujo de trabajo, este puede ser el tipo de cosas que rara vez necesita lo suficiente como para que tenga poco sentido tratar de encontrar una solución de línea de comandos (a menos que esté trabajando sin una interfaz gráfica por alguna razón).

Simplemente use una de las herramientas basadas en GUI que admiten la administración de índices, por ejemplo:

  • git gui <- utiliza el marco de ventanas Tk - estilo similar a gitk
  • git cola <- una interfaz GUI más moderna

Estos le permiten mover archivos dentro y fuera del índice con solo apuntar y hacer clic. Incluso tienen soporte para seleccionar y mover partes de un archivo (cambios individuales) hacia y desde el índice.


¿Qué tal una perspectiva diferente? Si te equivocas mientras usas uno de los comandos sugeridos, más bien crípticos:

  • git rm --cached [file]
  • git reset HEAD <file>

... tiene una posibilidad real de perder datos, o al menos hacer que sea difícil de encontrar. A menos que realmente necesite hacer esto con una frecuencia muy alta, es probable que usar una herramienta GUI sea más seguro .


Trabajando sin el índice

Según los comentarios y votos, me he dado cuenta de que mucha gente usa el índice todo el tiempo. Yo no. Así es cómo:

  • Confirmar mi copia de trabajo completa (el caso típico): git commit -a
  • Confirmar solo unos pocos archivos: git commit (list of files)
  • Comprometerse todos, pero algunos archivos modificados: git commit -aa continuación, modificar a travésgit gui
  • Revise gráficamente todos los cambios en la copia de trabajo: git difftool --dir-diff --tool=meld

@ Martin: Creo que depende de tu flujo de trabajo. En mi enfoque, nunca uso el índice directamente. Cuando quiero guardar mi trabajo, solo hago compromisos completos con git commit -a. Cuando estaba respondiendo a esta pregunta, fue porque había hecho (una exótica) " selección inversa de cereza " que pone los archivos en el índice para usted, pero quería editar un archivo antes de comprometerme. Saqué el archivo del índice mientras lo editaba para que las diferencias funcionen de la manera en que estoy acostumbrado.
nobar

mi caso de uso era muy estrecho e inútil de hecho: crear una rama; agregue carpeta llena de archivos solo para rama; cambiar a maestro; unir; ops, se agregó una carpeta incorrecta al maestro, se agregó a gitignore; los archivos no se eliminarían de commit - grant, una mejor solución sería usarlo de rminmediato, pero primero pensé que cambiar las ramas no eliminaría la carpeta ignorada . pero ... utilizo la herramienta "gui" de github que es lo suficientemente buena para mí y sí soporto algo de gestión de índices, excepto que no es compatible con esto. Entonces, ¿qué debo usar 2 gui para un uso limitado? Todavía no puedo estar de acuerdo con la respuesta.
cregox

3
Esta es una respuesta decididamente impopular. Sin embargo, estoy bastante seguro de que el enfoque que sugiero es el adecuado para algunas personas (incluido yo mismo). Utilizo una de estas herramientas para manipular el índice varias veces al año.
nobar

1
Hoy en día, es probable que los editores de programación y los IDE admitan la manipulación de índices gráficos. Al menos el átomo de GitHub lo hace.
nobar

1
Prefiero una interfaz CLI sobre GUI cualquier día, aunque es más peligroso. Me permitirá usar git incluso sin la interfaz gráfica de usuario, lo que me parece reconfortante (en lugar de perderme cuando no puedo instalar tales herramientas en un servidor remoto, por ejemplo). Todo lo que dijo esta respuesta es perfectamente válido y no merece votos negativos "cli elitistas", ¡+1 por proporcionar una buena alternativa gui!
SidOfc
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.