HDP115

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.

CE

Cristian Escalante

Última actualización: 19 de abril de 2025

git
control de versiones
desarrollo

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:

  1. Working Directory (Directorio de trabajo)
  2. Staging Area (Área de preparación)
  3. 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:

  1. 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
  2. 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:

  1. Modificas archivos en tu directorio de trabajo
  2. Preparas los cambios añadiéndolos al área de preparación (staging)
  3. 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

  1. Commits frecuentes: Haz commits pequeños y frecuentes que representen cambios lógicos completos.
  2. Preparación selectiva: Usa git add de forma selectiva para crear commits coherentes.
  3. Mensajes descriptivos: Escribe mensajes de commit claros que expliquen el "qué" y el "por qué" del cambio.
  4. Verificación antes de commit: Usa git diff --staged para revisar los cambios antes de confirmarlos.
  5. 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.

Commits, Ramas y Merges
Comprende los conceptos fundamentales de Git como commits, r...
Flujo de trabajo básico en Git
Aprende el flujo de trabajo fundamental en Git para gestiona...
Referencias
Scott Chacon and Ben Straub. Pro Git Book - Git Basics. https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository
Git Documentation. Git Internals - Git Objects. https://git-scm.com/book/en/v2/Git-Internals-Git-Objects

Conceptos Básicos de HTML

Aprende los conceptos básicos de HTML

Conceptos Básicos de CSS

Aprende los conceptos básicos de CSS

Conceptos Básicos de JavaScript

Aprende los conceptos básicos de JavaScript

Conceptos Básicos SQL

Aprende los conceptos básicos de SQL

Conceptos Básicos de Python

Aprende los conceptos básicos de Python

Conceptos Básicos de UML

Aprende los conceptos básicos de UML

Refuerzo Academico de Herramientas de Productividad 2025