Working Directory, Staging Area y Commit History
Comprende las tres áreas fundamentales de Git (directorio de trabajo, área de preparación e historial de commits) y cómo interactúan entre sí en el flujo de trabajo de Git.
Cristian Escalante
Última actualización: 19 de abril de 2025
Working Directory, Staging Area y Commit History
Git maneja tus archivos a través de tres áreas principales que forman el núcleo de su funcionamiento. Entender estas áreas y cómo interactúan entre sí es fundamental para dominar Git y utilizarlo eficientemente en tus proyectos.
Las tres áreas de Git
Git divide su funcionamiento en tres áreas principales:
- Working Directory (Directorio de trabajo)
- Staging Area (Área de preparación)
- Commit History (Historial de commits)
Veamos en detalle cada una de estas áreas y cómo funcionan juntas.
Working Directory (Directorio de trabajo)
El directorio de trabajo es simplemente la carpeta de tu proyecto donde trabajas y modificas tus archivos. Es donde:
- Creas nuevos archivos
- Modificas archivos existentes
- Eliminas archivos que ya no necesitas
Características del Working Directory:
- Contiene todos los archivos de tu proyecto, incluyendo los que Git no rastrea
- Refleja el estado actual de tus archivos (lo que estás editando)
- Es donde realizas todos tus cambios antes de registrarlos en Git
Estados de los archivos en el Working Directory:
- Tracked (Rastreados): Archivos que Git conoce y sigue sus cambios
- Unchanged (Sin cambios): Coinciden con la versión en el último commit
- Modified (Modificados): Han sido cambiados desde el último commit
- Staged (Preparados): Han sido añadidos al área de preparación
- Untracked (No rastreados): Archivos nuevos que Git no conoce todavía
Comandos relacionados con el Working Directory:
# Ver el estado de los archivos
git status
# Ver cambios en archivos modificados pero no preparados
git diff
# Descartar cambios en un archivo específico
git checkout -- archivo.txt
# Descartar todos los cambios no preparados
git restore .
# o en versiones antiguas
git checkout -- .
Staging Area (Área de preparación)
También conocida como "index" o "área de preparación", es un área intermedia donde seleccionas qué cambios quieres incluir en tu próximo commit. Funciona como una zona de preparación donde decides exactamente qué modificaciones formarán parte de la próxima instantánea de tu proyecto.
Características del Staging Area:
- Es un archivo en el directorio
.git
que registra lo que irá en tu próximo commit - Permite preparar cambios de forma selectiva
- Te da control sobre qué cambios específicos incluir en cada commit
- Permite revisar y verificar tus cambios antes de confirmarlos
Comandos relacionados con el Staging Area:
# Añadir un archivo al área de preparación
git add archivo.txt
# Añadir todos los archivos modificados
git add .
# Añadir partes específicas de un archivo
git add -p archivo.txt
# Ver qué cambios están en el área de preparación
git diff --staged
# Quitar un archivo del área de preparación (sin perder cambios)
git restore --staged archivo.txt
# o en versiones antiguas
git reset HEAD archivo.txt
Commit History (Historial de commits)
El historial de commits es el registro permanente de todos los cambios confirmados en tu repositorio. Cada commit es una instantánea del estado de tu proyecto en un momento específico, con un mensaje descriptivo y metadatos como autor y fecha.
Características del Commit History:
- Almacena de forma permanente las instantáneas de tu proyecto
- Cada commit tiene un identificador único (hash SHA-1)
- Forma una cadena donde cada commit apunta a su predecesor
- Se puede navegar, buscar y comparar commits
- Se puede revertir a cualquier punto anterior
Comandos relacionados con el Commit History:
# Crear un nuevo commit con los cambios preparados
git commit -m "Mensaje descriptivo"
# Ver el historial de commits
git log
# Ver el historial con cambios detallados
git log -p
# Ver historial gráfico
git log --graph --oneline --all
# Ver detalles de un commit específico
git show abc123
El flujo de trabajo entre las tres áreas
El flujo de trabajo típico en Git sigue estos pasos:
- Modificas archivos en tu directorio de trabajo
- Preparas los cambios añadiéndolos al área de preparación (staging)
- Confirmas los cambios creando un commit que se guarda en el historial
Ejemplo de flujo completo:
# 1. Editas un archivo en tu editor
echo "Nueva funcionalidad" >> archivo.txt
# 2. Verificas el estado
git status
# Muestra: "archivo.txt" modificado
# 3. Añades el archivo al área de preparación
git add archivo.txt
# 4. Verificas el estado nuevamente
git status
# Muestra: "archivo.txt" preparado para commit
# 5. Creas un commit con los cambios preparados
git commit -m "Añade nueva funcionalidad"
# 6. El cambio ahora está en el historial
git log
# Muestra el nuevo commit
Visualización del proceso
+---------------------+ +-------------------+ +------------------+
| Working Directory | | Staging Area | | Commit History |
| | | (Index) | | (.git directory) |
| [archivo.txt] | | | | |
| modificado | git | [archivo.txt] | git | Commit A |
| | add | preparado |commit| Commit B |
| | --> | | --> | Commit C |
| | | | | |
+---------------------+ +-------------------+ +------------------+
Casos de uso avanzados
Preparación parcial de archivos
Git permite añadir partes específicas de un archivo al área de preparación, lo que es útil cuando has realizado múltiples cambios pero quieres crear commits separados:
git add -p archivo.txt
# Git te mostrará cada cambio y te preguntará si quieres añadirlo
Commits atómicos
Una buena práctica es crear commits que representen un cambio lógico único (atómico):
# Modificas tres archivos para una funcionalidad
git add componente.js
git add estilos.css
git commit -m "Añade botón de login"
# Modificas otro archivo para corregir un error
git add utilidades.js
git commit -m "Corrige validación de email"
Deshacer cambios en diferentes áreas
# Deshacer cambios en el Working Directory
git checkout -- archivo.txt # Git clásico
git restore archivo.txt # Git moderno
# Deshacer cambios en el Staging Area
git reset HEAD archivo.txt # Git clásico
git restore --staged archivo.txt # Git moderno
# Deshacer el último commit (manteniendo cambios en Staging)
git reset --soft HEAD~1
# Deshacer el último commit (descartando cambios)
git reset --hard HEAD~1
Comandos para inspeccionar las áreas
# Ver diferencias entre Working Directory y Staging Area
git diff
# Ver diferencias entre Staging Area y último commit
git diff --staged
# Ver diferencias entre Working Directory y último commit
git diff HEAD
# Ver diferencias entre dos commits
git diff abc123..def456
Mejores prácticas
- Commits frecuentes: Haz commits pequeños y frecuentes que representen cambios lógicos completos.
- Preparación selectiva: Usa
git add
de forma selectiva para crear commits coherentes. - Mensajes descriptivos: Escribe mensajes de commit claros que expliquen el "qué" y el "por qué" del cambio.
- Verificación antes de commit: Usa
git diff --staged
para revisar los cambios antes de confirmarlos. - Mantén limpio el Working Directory: Haz commit o stash de los cambios importantes antes de cambiar de contexto.
Herramientas visuales
Existen muchas herramientas gráficas que facilitan la visualización y gestión de las tres áreas de Git:
- GitKraken: Interfaz gráfica completa para Git
- Sourcetree: Cliente visual para Git
- Visual Studio Code: Con su integración de Git y extensiones como GitLens
- GitHub Desktop: Interfaz simplificada para operaciones comunes de Git
Conclusión
Entender las tres áreas fundamentales de Git (Working Directory, Staging Area y Commit History) y cómo interactúan entre sí es esencial para utilizar Git eficazmente. Este conocimiento te permite:
- Tener mayor control sobre tus cambios
- Crear un historial de proyecto limpio y organizado
- Colaborar más eficientemente con otros desarrolladores
- Recuperarte de errores con facilidad
Dominar este flujo de trabajo te convertirá en un usuario de Git más competente y te ayudará a gestionar tus proyectos de forma más efectiva.