El índice —también llamado área de preparación o staging area— es quizás el concepto que más confunde a quienes vienen de otros sistemas de control de versiones, porque la mayoría no tiene un equivalente directo.
En muchos sistemas, "guardar cambios" es un solo paso: se elige qué archivos incluir y se confirma, todo junto. Git separa esto en dos pasos porque permite construir un commit a medida, incluso cuando el directorio de trabajo tiene una mezcla de cambios que no se quieren registrar todos juntos.
El índice es, en esencia, un borrador del próximo commit. Contiene
una lista de qué archivos (y qué versión exacta de su contenido, no
solo su nombre) se incluirán la próxima vez que se ejecute git
commit.
directorio de trabajo --git add--> índice --git commit--> repositorio
git add archivo copia el contenido actual de ese archivo al
índice. A partir de este momento, el índice tiene una versión
"congelada" de ese archivo, independiente de si se lo sigue editando
después en el directorio de trabajo.
git commit toma todo lo que hay en el índice —y solo eso— y
lo empaqueta en un nuevo objeto commit.
Un detalle que sorprende a quienes empiezan: si se edita un archivo
después de haber hecho git add, esos cambios nuevos no
están en el índice. git status en ese caso muestra el mismo
archivo dos veces: una vez como "cambios preparados para el commit"
(la versión que quedó en el índice) y otra como "cambios sin
preparar" (la edición posterior). Hay que volver a hacer git
add para incluir también esa segunda edición.
Como el índice es independiente del directorio de trabajo, es posible preparar solo parte de los cambios de un archivo:
git add -p archivo.txt
Esto recorre el archivo por bloques de cambios (hunks) y pregunta, uno por uno, si cada bloque debe ir al índice. Es útil para dividir una sesión de trabajo desordenada en varios commits lógicos y coherentes, en vez de un único commit mezclado.
git statusMuestra qué hay en el índice comparado con el último commit (cambios preparados) y qué hay en el directorio de trabajo comparado con el índice (cambios sin preparar).
git diffSin argumentos, compara el directorio de trabajo contra el índice: muestra los cambios que no se prepararon todavía.
git diff --stagedCompara el índice contra el último commit: muestra qué se incluiría
si se hiciera commit ahora mismo.
git restore --staged archivoQuita un archivo del índice sin tocar el directorio de trabajo, es decir, "despreparar" un cambio sin perderlo.
Entender el índice como una tercera copia independiente del
contenido —ni el directorio de trabajo, ni el último commit, sino
un borrador aparte— es la base para entender más adelante por qué
git reset tiene tres modos distintos (see Deshacer cambios): cada modo decide hasta dónde retroceder entre estas tres
áreas.