4 El índice

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.

4.1 Por qué existe una etapa intermedia

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.

4.2 El flujo básico

directorio de trabajo  --git add-->  índice  --git commit-->  repositorio
  1. Se edita un archivo en el directorio de trabajo.
  2. 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.
  3. 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.

4.3 Preparación parcial

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.

4.4 Consultar y modificar el índice

git status

Muestra 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 diff

Sin argumentos, compara el directorio de trabajo contra el índice: muestra los cambios que no se prepararon todavía.

git diff --staged

Compara el índice contra el último commit: muestra qué se incluiría si se hiciera commit ahora mismo.

git restore --staged archivo

Quita 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.