← Git

Commits y cambios

¿Qué hacen `git add` y `git commit`, y por qué son dos pasos separados?

Ver respuesta — intenta responderla en voz alta primero

git add prepara (mueve al staging area) los cambios que quieres incluir en el próximo commit. git commit toma lo que está en staging y lo guarda como una foto permanente en el historial, con un mensaje. Son dos pasos para que puedas elegir exactamente qué entra en cada commit.

  • git add: le dices a Git "quiero incluir estos cambios en el próximo commit". No guarda nada en el historial todavía; solo los mueve al staging area.
  • git commit: toma todo lo que está en staging y crea un commit: una foto del proyecto con un mensaje, un autor y una fecha. Ese commit queda en el historial para siempre.

Que sean dos pasos es una ventaja: te deja armar commits limpios. Puedes editar cinco archivos pero commitear solo dos que van juntos, y dejar los otros para otro commit con su propio mensaje.

La bandera -m te permite escribir el mensaje en la misma línea. Sin ella, Git abre un editor de texto.

# Preparar un archivo específico
git add index.html

# Preparar TODOS los cambios del working directory
git add .

# Confirmar lo que está en staging con un mensaje
git commit -m "Agrega la estructura inicial de la página"
# Salida: [main 1a2b3c4] Agrega la estructura inicial de la página
#         1 file changed, 10 insertions(+)

# Atajo: add + commit de archivos YA rastreados en un solo paso
git commit -am "Corrige el título del encabezado"
# -a añade automáticamente los cambios de archivos ya rastreados
# OJO: -a NO incluye archivos untracked (nuevos)

Usar git commit -am creyendo que incluye archivos nuevos. La bandera -a solo añade cambios de archivos que Git ya rastrea; los archivos untracked (nuevos) hay que añadirlos con git add explícitamente. Otro error clásico: hacer git commit sin git add antes y sorprenderse de que "no hay nada que commitear".

"git add prepara los cambios que quiero incluir, moviéndolos al staging area, y git commit los guarda como una foto permanente en el historial con un mensaje. Son dos pasos a propósito: me dejan armar commits limpios, eligiendo qué archivos van juntos en cada commit. Uso -m para el mensaje en la misma línea, y a veces commit -am como atajo, pero recordando que eso no incluye archivos nuevos."

Reto rápido

Creaste un archivo nuevo estilos.css y modificaste index.html (que ya estaba en Git). Ejecutas git commit -am "cambios". ¿Qué se guarda?

Ver respuesta

Solo se guarda el cambio de index.html. La bandera -a incluye automáticamente los cambios de archivos ya rastreados, pero estilos.css es nuevo (untracked), así que Git lo ignora. Para incluirlo tendrías que hacer git add estilos.css antes del commit.