← Git

Commits y cambios

¿Para qué sirven `git status` y `git diff`, y en qué se diferencian?

Ver respuesta — intenta responderla en voz alta primero

git status te dice el estado de los archivos: en qué rama estás, qué está en staging, qué está modificado y qué es untracked. git diff te muestra el contenido exacto de los cambios, línea por línea. git diff compara working vs staging, y git diff --staged compara staging vs último commit.

Son tus dos herramientas para saber "qué está pasando" antes de commitear.

  • git status: la vista general. Te dice qué archivos cambiaron y en qué área están (staged o no, tracked o untracked). No muestra el contenido de los cambios, solo los nombres y su estado.
  • git diff: el detalle. Muestra las líneas que agregaste (+) y quitaste (-).
    • git diff (sin nada): compara el working directory contra el staging → los cambios que aún no has hecho add.
    • git diff --staged (o --cached): compara el staging contra el último commit → lo que vas a commitear.

Regla práctica: status para el panorama, diff para revisar exactamente qué vas a guardar.

# Panorama general del repo
git status
# On branch main
# Changes to be committed: (verde, en staging)
# Changes not staged for commit: (rojo, sin preparar)
# Untracked files: (rojo, nuevos)

# Versión resumida y corta
git status -s
#  M archivo.txt   (modificado, sin stage)
# M  otro.txt      (modificado, en stage)
# ?? nuevo.txt     (untracked)

# Ver cambios que AÚN NO están en staging
git diff

# Ver cambios que YA están en staging (lo que se commiteará)
git diff --staged

# Comparar dos commits
git diff abc1234 def5678

Creer que git diff muestra todos los cambios. Por defecto, git diff no muestra los cambios que ya están en staging: para esos necesitas git diff --staged. Muchos juniors hacen git add ., luego git diff para revisar, ven que sale vacío y se confunden, cuando lo correcto sería git diff --staged.

"git status me da el panorama: en qué rama estoy y qué archivos están en staging, modificados o untracked, pero solo los nombres. git diff me muestra el contenido de los cambios línea por línea. git diff a secas compara el working directory con el staging, o sea lo que aún no he preparado; y git diff --staged compara el staging con el último commit, o sea lo que voy a guardar. Uso status para el panorama y diff para revisar el detalle antes de commitear."

Reto rápido

Hiciste git add . y quieres revisar exactamente qué líneas vas a commitear. ¿Qué comando usas?

Ver respuesta

git diff --staged (equivalente a git diff --cached). Como los cambios ya están en el staging area, git diff a secas saldría vacío; necesitas --staged para comparar el staging contra el último commit y ver justo lo que se va a guardar.