Capítulo 3: Entendiendo cómo trabaja Git¶
En los capítulos anteriores aprendiste a instalar Git, configurarlo, crear tu primer repositorio y registrar los primeros cambios del proyecto principal del libro. Ahora toca dar un paso decisivo: comprender qué está ocurriendo dentro de Git cada vez que modificas un archivo, lo preparas y lo conviertes en un commit.[cite:49][cite:55]
Este capítulo es especialmente importante porque muchas dificultades con Git no nacen de los comandos, sino de una imagen mental incompleta. Cuando una persona cree que Git simplemente “guarda archivos”, se confunde con facilidad. Cuando entiende que Git trabaja con estados, historial, referencias e integridad, todo empieza a tener sentido.[cite:49]
A lo largo de estas secciones seguiremos utilizando el mismo repositorio del proyecto del libro: el sitio web personal iniciado en el capítulo anterior. No vas a crear proyectos nuevos ni a trabajar todavía con GitHub o ramas. El objetivo aquí es muy claro: mirar dentro del flujo local de Git y comprender por qué es rápido, seguro y confiable.[cite:49][cite:55]
3.1 ¿Qué ocurre realmente cuando usamos Git?¶
Cuando una persona comienza a usar Git, suele imaginar que la herramienta funciona como una especie de carpeta avanzada donde se van guardando copias sucesivas del proyecto. Esa idea no es del todo absurda, pero se queda corta. Git no se limita a almacenar documentos como si fueran archivos sueltos numerados. Su forma de trabajo es más inteligente y estructurada.[cite:49]
La documentación oficial explica que Git piensa en los datos como una serie de instantáneas de un pequeño sistema de archivos. Cada vez que haces un commit, Git toma una “foto” del estado del proyecto en ese momento y almacena una referencia a esa instantánea; si un archivo no cambió, Git no vuelve a guardar una copia completa idéntica, sino que reutiliza la referencia al contenido ya existente.[cite:49]
Guardar archivos no es lo mismo que registrar cambios¶
Aquí está una de las ideas más importantes del libro. Guardar archivos consiste en conservar contenido. Registrar cambios consiste en construir historia.
Supón que en tu proyecto sitio-web-personal modificas el texto de bienvenida de index.html. Si solo guardaras el archivo sobre la misma versión, el contenido nuevo existiría, pero el estado anterior desaparecería como referencia viva. En cambio, cuando Git registra el cambio mediante un commit, no solo conserva el estado actual: lo conecta con un momento anterior del proyecto y lo inserta dentro de una secuencia comprensible.[cite:49]
Una analogía cotidiana¶
Piensa en una libreta de dibujo. Guardar archivos sería como arrancar una hoja, dibujar encima de la siguiente y tirar la anterior. Registrar cambios sería más bien conservar cada dibujo importante como una página fechada dentro del cuaderno, de modo que al final puedas revisar cómo fue evolucionando tu trabajo.
Otra analogía útil es la de una película. Una carpeta común se parece a una sola fotografía del estado actual. Git se parece más a una película compuesta por escenas conectadas. Cada commit es una escena significativa dentro de una historia mayor.
La idea del historial¶
Git cobra verdadero sentido cuando lo ves como un sistema orientado al historial. El historial no es un adorno que aparece después. Es parte central de su diseño. Gracias a él puedes saber qué cambió, en qué momento quedó registrado ese cambio y cómo fue evolucionando el proyecto a lo largo del tiempo.[cite:49][cite:55]
En el sitio web personal que vienes construyendo, el historial ya comenzó a formarse desde el primer commit del capítulo anterior. El archivo README.md, el archivo index.html y sus primeras mejoras no existen solo como estado actual del proyecto: existen también como parte de una narrativa técnica.[cite:49]
Git no piensa como otros sistemas clásicos¶
El libro oficial de Git subraya una diferencia fundamental: muchos sistemas tradicionales de control de versiones pensaban los datos como una lista de cambios sobre archivos, mientras que Git los piensa como un flujo de instantáneas. Esa diferencia explica buena parte de su comportamiento y de sus ventajas.[cite:49]
Esto no significa que Git ignore las diferencias entre versiones. Significa que, en el fondo, su modelo mental principal es el estado del proyecto en momentos concretos.
Por qué esta diferencia importa¶
Cuando entiendes que Git registra estados e historia, varias cosas dejan de parecer raras:
- el área de preparación deja de ser un misterio;
- un commit deja de verse como un simple “guardar”;
- el historial se convierte en una herramienta de navegación;
- los identificadores de los commits empiezan a tener sentido.[cite:49][cite:55]
Una representación visual del cambio de mentalidad¶
Antes del siguiente diagrama, conviene comparar la visión ingenua de Git con la visión correcta.
flowchart TD
A[Editar archivo] --> B[Guardar encima del mismo archivo]
B --> C[Se pierde claridad del estado anterior]
D[Editar archivo] --> E[Preparar cambio]
E --> F[Crear commit]
F --> G[El cambio entra al historial]
En la primera secuencia solo existe el resultado actual. En la segunda aparece la lógica real de Git: el cambio no se borra en el tiempo, sino que se transforma en una entrada del historial del proyecto.[cite:49]
Nota
Git no fue diseñado para ser una “papelera de versiones”. Fue diseñado para construir una historia confiable del proyecto y permitir trabajar con ella.[cite:49]
Aplicado al proyecto del libro¶
Si hoy cambias el encabezado principal de index.html, mañana corriges una descripción en README.md y pasado mañana mejoras un párrafo de presentación, Git no piensa en eso como tres archivos sobrescritos una y otra vez. Lo interpreta como una sucesión de estados significativos del sitio web personal.[cite:49]
Eso cambia tu forma de trabajar. Dejas de pensar en “la última versión” como única realidad y empiezas a pensar en evolución controlada.
Breve conclusión: usar Git no consiste simplemente en almacenar archivos. Consiste en registrar estados del proyecto dentro de un historial confiable y navegable. Esa idea es la base de todo lo que veremos en el resto del capítulo.
3.2 Working Directory¶
El primer componente que necesitas comprender con claridad es el Working Directory, también llamado working tree en la documentación oficial. Se trata de la versión del proyecto que tienes físicamente en disco y sobre la que trabajas directamente.[cite:49]
Dicho de forma simple, el Working Directory es tu zona activa de trabajo. Ahí abres index.html, editas el contenido de README.md, cambias títulos, agregas texto y pruebas nuevas ideas.
Qué representa realmente¶
El Working Directory representa el presente visible del proyecto. Es el lugar donde existen los archivos tal como tú los ves y modificas con tu editor. Si el repositorio fuera una oficina, el Working Directory sería el escritorio donde están desplegados los documentos con los que estás trabajando ahora mismo.
La documentación oficial explica que estos archivos son una versión extraída del contenido almacenado por Git y colocada en el disco para que puedas usarla o modificarla.[cite:49]
Dónde trabaja el desarrollador¶
El desarrollador trabaja casi siempre en el Working Directory. Cuando editas el sitio web personal, lo haces sobre archivos reales del sistema de archivos:
- abres
README.mden tu editor; - modificas el contenido de
index.html; - guardas cambios;
- vuelves a revisar el resultado.
Todo eso ocurre aquí, no dentro del historial ni directamente dentro de la base interna de Git.
Cuándo un archivo pertenece al Working Directory¶
Un archivo pertenece al Working Directory cuando existe físicamente en la carpeta del proyecto y forma parte de la versión con la que estás trabajando. Puede estar en distintos estados respecto a Git:
- puede ser un archivo nuevo sin seguimiento;
- puede ser un archivo rastreado sin cambios;
- puede ser un archivo modificado;
- puede incluso estar preparado y seguir existiendo en el Working Directory al mismo tiempo.[cite:49]
Esto es importante: el Working Directory no desaparece cuando haces git add ni cuando haces un commit. Sigue siendo tu espacio de trabajo activo.
Ejemplo con el proyecto del libro¶
Supongamos que tu archivo index.html contiene este texto:
Si abres el archivo y cambias el párrafo por uno nuevo, ese cambio vive primero en el Working Directory. Git todavía no lo ha incorporado al siguiente commit. Solo existe como edición actual en tu zona de trabajo.[cite:49]
Si en ese momento ejecutas git status, Git te mostrará que el archivo fue modificado. Eso significa precisamente que el contenido del Working Directory ya no coincide con el último estado comprometido del repositorio.[cite:49]
Un ejemplo cotidiano¶
Piensa en una mesa de cocina. En la mesa estás cortando ingredientes, mezclando, probando, corrigiendo. Esa mesa es el Working Directory. Todavía no has servido el plato ni lo has registrado como versión final de la receta. Estás en pleno proceso.
Git no intenta evitar ese espacio de trabajo cambiante. Al contrario: lo reconoce como parte natural del flujo.
Qué ventajas aporta identificarlo correctamente¶
Entender el Working Directory te ayuda a evitar confusiones muy comunes:
- creer que guardar un archivo ya lo convierte en commit;
- pensar que Git registra automáticamente cada cambio;
- suponer que un archivo modificado ya forma parte del historial;
- no distinguir entre trabajo en curso y trabajo confirmado.[cite:49]
Arquitectura básica desde la perspectiva del Working Directory¶
Antes del siguiente diagrama, conviene ubicar el Working Directory dentro del flujo general de Git.
flowchart LR
A[Working Directory] --> B[Staging Area]
B --> C[Local Repository]
Este esquema parece simple, pero es clave. El archivo nace o se modifica primero en el Working Directory. Solo después puede pasar a la zona de preparación y más tarde al repositorio local.[cite:49]
Aplicado a README.md e index.html¶
En el proyecto del libro, README.md e index.html pasan una y otra vez por esta etapa. Cada ajuste que hagas —un nuevo título, una frase de presentación, una corrección ortográfica— aparecerá primero aquí. Por eso, cuando quieras entender qué está pasando en Git, una de las primeras preguntas debe ser: “¿qué hay ahora mismo en mi Working Directory?”
Consejo
Antes de preparar o confirmar cambios, piensa siempre en el Working Directory como tu borrador activo. Eso te ayudará a distinguir mejor entre trabajo en curso y trabajo ya incorporado al historial.
Error común¶
Un error muy frecuente es creer que el Working Directory contiene solo archivos “sin guardar en Git”. En realidad, contiene la versión viva del proyecto: archivos sin cambios, archivos modificados, archivos nuevos y archivos ya preparados pueden coexistir allí.[cite:49]
[Ilustración: escritorio digital moderno con un editor de código abierto mostrando index.html, una terminal al costado y una etiqueta visual sobre el área de trabajo indicando Working Directory como zona de edición activa]
Breve conclusión: el Working Directory es el lugar donde trabajas de verdad. Ahí nacen los cambios del proyecto y desde ahí comienza el recorrido interno que Git administra.
3.3 Staging Area¶
Si el Working Directory fuera el borrador activo del proyecto, la Staging Area sería la mesa de selección donde decides qué cambios entrarán en el siguiente commit. La documentación oficial la describe como una zona que almacena información sobre lo que se incluirá en la próxima instantánea del proyecto y recuerda que su nombre técnico también es index.[cite:49][cite:55]
Esta es una de las características que más diferencia a Git de una visión simplista del control de versiones. Git no te obliga a confirmar todo lo que modificaste. Te permite preparar con precisión el contenido del próximo commit.
¿Por qué Git utiliza un área intermedia?¶
Porque no todos los cambios que haces en tu directorio de trabajo deberían registrarse juntos. A veces editas dos archivos, pero solo uno está listo. O quizá hiciste una corrección importante y además dejaste otra prueba a medio terminar. La Staging Area existe para darte control sobre esa selección.[cite:49]
Esa decisión de diseño vuelve el historial más claro. En lugar de generar commits caóticos, puedes construir commits que representen unidades lógicas de trabajo.
Qué ventajas aporta¶
La Staging Area ofrece ventajas muy concretas:
- te permite elegir qué cambios formarán parte del siguiente commit;
- evita que el historial registre accidentalmente trabajo incompleto;
- ayuda a construir commits más pequeños y comprensibles;
- separa la edición del acto de registrar historia.[cite:49]
Dicho de otra manera, funciona como una capa de intención.
Qué ocurre cuando ejecutamos git add¶
La documentación oficial explica que, al preparar cambios, Git agrega a la Staging Area solo la versión actual del archivo en ese momento. Esa es una idea decisiva: git add toma una instantánea del contenido y la coloca en el área de preparación para el siguiente commit.[cite:49]
Supón que README.md contiene una descripción inicial del proyecto. Lo editas para hacerla más clara y luego ejecutas:
Con ese paso, Git toma la versión actual de README.md y la coloca en la Staging Area. Aún no existe un commit nuevo, pero el archivo ya quedó preparado para formar parte del siguiente registro.[cite:49]
¿Qué pasa si seguimos modificando archivos después?¶
Aquí aparece una de las lecciones más importantes del capítulo. Si después de ejecutar git add README.md vuelves a abrir ese archivo y haces otra modificación, esa nueva edición no queda automáticamente preparada. La Staging Area conserva la instantánea tomada en el momento de git add; el Working Directory, mientras tanto, ya contiene una versión más reciente.[cite:49]
Eso significa que un archivo puede estar, al mismo tiempo:
- preparado con una versión determinada en la Staging Area;
- modificado nuevamente en el Working Directory.
Este comportamiento puede parecer extraño al principio, pero en realidad es señal de gran precisión.
Ejemplo paso a paso con el proyecto del libro¶
Imagina esta secuencia sobre index.html:
- Cambias el encabezado principal.
- Ejecutas
git add index.html. - Después cambias también el párrafo de bienvenida.
- Ejecutas
git status.
En ese momento, Git puede mostrar que index.html tiene cambios preparados y, al mismo tiempo, cambios no preparados. ¿Por qué? Porque la primera versión quedó fotografiada en la Staging Area, mientras que la segunda modificación sigue viviendo solo en el Working Directory.[cite:49]
Una analogía muy útil¶
Piensa en una bandeja de salida para documentos impresos. Preparar un archivo sería colocar en esa bandeja la versión lista para enviarse. Si luego corriges el documento que todavía tienes abierto en tu escritorio, la bandeja no cambia por arte de magia. Tendrías que reemplazar la versión ya preparada con una nueva si quieres que ese cambio adicional también se envíe.
Diagrama principal de la Staging Area¶
Antes del siguiente cierre, observa la posición exacta del área de preparación.
flowchart LR
A[Working Directory] -->|git add| B[Staging Area]
B -->|git commit| C[Local Repository]
La Staging Area está entre la edición y el historial. No es el lugar donde trabajas ni el lugar donde el cambio queda definitivamente almacenado. Es la antesala del commit.[cite:49]
Qué errores evita esta etapa¶
Sin un área intermedia, cualquier cambio guardado en archivos podría entrar al historial sin filtro. Eso produciría registros más desordenados. Git evita ese problema introduciendo una fase donde tú decides qué contenido está listo para volverse parte de la historia del proyecto.[cite:49]
Diferencia entre preparar todo y preparar con criterio¶
En nuestro proyecto sitio-web-personal, imagina que modificas README.md y index.html al mismo tiempo. Podría ser correcto preparar ambos juntos si forman una sola mejora lógica. Pero si README.md contiene una corrección documental y index.html una reescritura importante de presentación, quizá sea mejor preparar uno primero y luego el otro.
La Staging Area te permite ejercer ese criterio.
| Situación | Qué conviene hacer |
|---|---|
| Todo el cambio pertenece a una sola mejora | Preparar todo junto puede ser razonable |
| Los cambios responden a ideas distintas | Conviene preparar por partes |
| Aún estás probando una parte del trabajo | Es mejor no prepararla todavía |
| Quieres un historial más legible | Usa la Staging Area con intención |
Error común
Pensar que
git add“guarda definitivamente” el archivo. En realidad, lo prepara para el próximo commit; todavía no lo convierte en historial.[cite:49]Buenas prácticas
Usa la Staging Area para construir commits con sentido. Un historial claro empieza antes del commit, en la selección de lo que decides preparar.
Aplicado al aprendizaje¶
La razón pedagógica por la que esta sección es tan importante es simple: muchas confusiones desaparecen en cuanto entiendes que Git separa tres cosas distintas: trabajar, preparar y confirmar. La Staging Area es el puente que hace visible esa separación.[cite:49]
Breve conclusión: la Staging Area existe para darte control. Te permite decidir qué versión exacta de un archivo formará parte del siguiente commit y evita que el historial se llene de cambios mezclados o incompletos.
3.4 Local Repository¶
El tercer componente central es el Local Repository, es decir, el repositorio local de Git almacenado en tu equipo. La documentación oficial lo relaciona con el directorio Git, donde se guardan los metadatos y la base de datos de objetos del proyecto; es la parte más importante de Git y la que se copia cuando se clona un repositorio.[cite:49]
Hasta ahora has visto dos zonas previas: el Working Directory, donde editas, y la Staging Area, donde preparas. El Local Repository es el lugar donde el cambio ya queda registrado como parte del historial mediante un commit.[cite:49]
Qué contiene¶
Conceptualmente, el repositorio local contiene:
- la historia de los commits;
- los objetos necesarios para representar esos estados;
- referencias internas que Git utiliza para orientarse;
- la información persistente del proyecto bajo control de versiones.[cite:49][cite:55]
No necesitas explorar todavía su estructura interna en detalle. Lo importante es entender que aquí vive la memoria confiable del proyecto.
Cuándo se guarda un commit¶
Un commit se guarda en el repositorio local cuando ejecutas git commit. En ese momento, Git toma el contenido tal como está preparado en la Staging Area y lo almacena permanentemente como una instantánea dentro de su base de datos local.[cite:49]
La palabra importante aquí es preparado. Git no toma cualquier cosa que esté en el Working Directory. Toma lo que ya fue seleccionado para el siguiente paso del historial.[cite:49]
Qué representa realmente un commit¶
La documentación oficial insiste en que un commit es una instantánea del estado del proyecto. No representa un archivo aislado, sino una foto coherente del conjunto tal como fue preparado para ese momento.[cite:49]
Eso significa que, si haces un commit en tu proyecto sitio-web-personal, Git no está diciendo únicamente “cambió index.html”. Está diciendo algo más fuerte: “éste era el estado relevante del proyecto en este punto de su evolución”.
Un commit es más que un botón de guardar¶
Guardar un archivo en el editor protege el trabajo actual en disco. Un commit protege una etapa significativa del proyecto dentro del historial.
Por eso conviene pensar en el commit como una versión con intención. Tiene contexto, mensaje, posición temporal y relación con otros commits.
Cómo se construye el historial¶
El historial se construye como una sucesión de commits. Cada nuevo commit se incorpora al repositorio local y queda conectado con el anterior, formando una línea temporal de estados del proyecto.[cite:49][cite:55]
Esta idea es especialmente poderosa porque permite que el repositorio no sea solo un contenedor de versiones, sino una estructura navegable. Puedes ver qué vino antes, qué vino después y cómo fue creciendo el proyecto.
Ejemplo con el sitio web personal¶
Imagina que el historial de tu proyecto ya contiene tres commits:
- estructura inicial del sitio;
- descripción inicial en
README.md; - mejora del contenido principal de
index.html.
Cada uno de esos commits vive en el repositorio local. No son solo recuerdos humanos ni archivos copiados en una carpeta aparte. Son estados formales del proyecto conservados por Git.[cite:49]
Diagrama del paso hacia el repositorio local¶
Antes del siguiente análisis, observa el momento en que un cambio preparado se convierte en historia persistente.
flowchart TD
A[Cambio preparado en Staging Area] --> B[git commit]
B --> C[Se crea una instantánea del proyecto]
C --> D[El commit queda guardado en el Local Repository]
Este es el momento en que el proyecto gana memoria duradera. Antes había trabajo en curso. Ahora hay historia registrada.[cite:49]
Por qué el repositorio local vuelve a Git tan rápido¶
La documentación oficial destaca que casi todas las operaciones de Git son locales. Como el historial está disponible en tu propio disco, revisar commits, comparar estados y explorar la evolución del proyecto puede hacerse sin depender constantemente de otro equipo o servidor.[cite:49]
Eso explica una de las sensaciones más características de Git: rapidez. No necesita salir a la red para casi todo; trabaja sobre información local que ya tiene disponible.[cite:49]
Por qué también vuelve a Git más confiable¶
Además de velocidad, el repositorio local da resiliencia. Si el historial ya fue confirmado con commits, no depende de tu memoria ni de una carpeta improvisada de respaldo. Está guardado dentro de la base interna del repositorio, con integridad controlada por Git.[cite:49]
Curiosidad
El libro oficial de Git subraya que, al tener la historia del proyecto en disco local, operaciones como revisar historial o comparar estados resultan casi instantáneas.[cite:49]
Error común
Creer que un archivo modificado ya está en el repositorio local. No lo está hasta que el contenido preparado se convierte en commit.[cite:49]
Lo que todavía no veremos¶
En este capítulo no hablaremos del repositorio remoto. Esa pieza llegará más adelante. Por ahora es importante concentrarse en lo que ya puedes comprender por completo dentro de tu equipo: editar, preparar y registrar historia local.[cite:49]
Breve conclusión: el Local Repository es la memoria persistente de Git en tu computadora. Allí viven los commits y allí se construye la historia real del proyecto.
3.5 HEAD¶
Una vez que comprendes el repositorio local, aparece una pregunta natural: si hay varios commits, ¿cómo sabe Git en cuál se encuentra “ahora”? La respuesta sencilla es HEAD.
La documentación oficial sobre revisiones indica que HEAD nombra el commit sobre el cual se basan los cambios del Working Directory. Dicho de manera simple, HEAD representa la posición actual dentro del historial local.[cite:55]
Qué es HEAD¶
HEAD es una referencia especial que le dice a Git cuál es el commit actual desde la perspectiva de tu trabajo. No tienes que imaginarlo como un archivo más del proyecto ni como un contenido visible en README.md o index.html. Es una referencia interna que orienta a Git dentro de la historia.[cite:55]
Qué representa¶
HEAD representa el punto del historial sobre el que estás trabajando. Si piensas en el historial como una cadena de commits, HEAD actúa como un marcador que señala el lugar actual.
Una analogía sencilla: imagina que estás leyendo un libro y colocas un separador entre páginas. El libro completo es el historial; el separador indica dónde estás ahora. Ese separador sería HEAD.
Por qué siempre apunta al último commit¶
En el flujo normal de trabajo que estás usando en este libro, cada nuevo commit se agrega al final de la historia local, y HEAD pasa a señalar ese commit más reciente. Por eso suele decirse de forma introductoria que HEAD apunta al último commit.[cite:55]
Esta explicación es suficiente para este capítulo. Más adelante existen situaciones más avanzadas, pero por ahora lo importante es retener la idea central: HEAD marca el commit actual sobre el que se apoya tu trabajo.
Ejemplo con el proyecto del libro¶
Supongamos que el historial del sitio web personal contiene estos commits:
Crear estructura inicial del sitio web personalAgregar descripción inicial al READMEActualizar contenido principal de index.html
Si el tercer commit es el más reciente, HEAD apuntará ahí. Eso significa que tu Working Directory está basado en ese estado actual del proyecto.[cite:55]
Qué pasa cuando creas un nuevo commit¶
Cuando haces un nuevo commit, Git agrega ese nuevo punto al historial y HEAD avanza para señalarlo. Así, el marcador siempre se mantiene en el extremo actual del trabajo normal.
Diagrama para entender HEAD¶
Antes del siguiente cierre, observa HEAD como un puntero al punto actual del historial.
flowchart LR
A[Commit 1] --> B[Commit 2]
B --> C[Commit 3]
C --> D[Commit 4]
E[HEAD] --> D
Este diagrama resume la idea principal: HEAD no es otro commit aparte, sino una referencia que apunta al commit actual.[cite:55]
Por qué esta idea ayuda tanto¶
Comprender HEAD te ayuda a dejar de ver el historial como una lista estática. Git no solo conserva commits; también sabe desde cuál de ellos estás trabajando ahora mismo. Eso es clave para entender muchas acciones futuras.
Una forma cotidiana de pensarlo¶
Imagina una ruta en un mapa con varias paradas marcadas. HEAD sería el pin que indica en cuál parada estás situado actualmente. La ruta completa sigue existiendo, pero el pin te da contexto inmediato sobre tu posición.
Nota
En este capítulo basta con entender a HEAD como el marcador del commit actual. No es necesario profundizar todavía en variantes avanzadas de esta referencia.[cite:55]
¿Sabías que...?
La documentación de revisiones de Git menciona a
@como un atajo paraHEAD, lo que muestra lo central que es esta referencia dentro del sistema.[cite:55]
Error común¶
Un error frecuente es pensar que HEAD apunta al archivo que acabas de modificar. No. HEAD apunta al commit actual, es decir, a un punto del historial, no a un archivo suelto.[cite:55]
Breve conclusión: HEAD es el marcador que indica dónde estás en la historia del repositorio. Gracias a él, Git puede relacionar tu trabajo actual con el commit que sirve como base del estado presente del proyecto.
3.6 Los hashes¶
Otro de los conceptos que hace a Git tan confiable es el uso de hashes. La documentación oficial explica que todo en Git es verificado mediante un checksum antes de almacenarse y que luego se hace referencia a ese contenido mediante dicho valor. También señala que el mecanismo empleado es un hash SHA-1 representado como una cadena hexadecimal de 40 caracteres.[cite:49][cite:55]
Aunque estas palabras pueden sonar técnicas, la idea central es bastante accesible.
¿Qué es un hash?¶
En este contexto, un hash puede entenderse como una huella digital calculada a partir del contenido. Si el contenido cambia, la huella también cambia. Si el contenido es el mismo, la huella correspondiente se mantiene igual.[cite:49]
No hace falta entrar en criptografía para captar la importancia práctica de esto. Git necesita una forma muy precisa de identificar el contenido y detectar alteraciones. El hash cumple justamente esa función.
Por qué cada commit posee uno¶
Cada commit tiene un identificador basado en hash porque Git necesita reconocer de forma única ese punto del historial. La documentación de revisiones explica que un commit puede nombrarse por su objeto SHA-1 completo o por una parte inicial suficientemente larga y única dentro del repositorio.[cite:55]
Eso significa que cuando consultas el historial con git log, esos identificadores no son números decorativos. Son la manera en que Git distingue de forma precisa un commit de otro.[cite:55]
Qué garantiza la integridad del historial¶
El libro oficial de Git afirma que todo en Git es checksummed antes de almacenarse y luego se referencia mediante ese checksum. También subraya que esto hace imposible cambiar el contenido de un archivo o directorio sin que Git lo sepa.[cite:49]
Esa es la idea clave de la integridad en Git: el sistema no depende solo de nombres humanos o de fechas. Usa identificadores derivados del contenido, por lo que puede detectar inconsistencias o alteraciones con enorme precisión.[cite:49]
Una analogía sencilla¶
Piensa en un sello de seguridad colocado sobre una caja. Si alguien abre la caja o altera su contenido, el sello deja evidencia. El hash cumple una función parecida: ayuda a que Git sepa si el contenido corresponde realmente a lo que fue registrado.
Otra analogía útil es la de una huella digital en un documento legal. No necesitas entender toda la matemática detrás del proceso para confiar en que cumple una función de identificación e integridad.
Ejemplo aplicado al proyecto del libro¶
Cuando haces un commit que actualiza index.html, Git no lo guarda como “el commit de ese miércoles por la tarde”. Lo almacena con una identidad derivada del contenido del commit y del objeto correspondiente. Así puede distinguirlo de otro commit, aunque ambos tengan mensajes parecidos.[cite:49][cite:55]
Qué verás tú como usuario¶
Normalmente verás hashes en dos situaciones introductorias:
- al consultar el historial con
git log; - al ver versiones resumidas en salidas como
git log --oneline.
No necesitas memorizar esos valores. Basta con reconocer que Git los utiliza porque necesita una forma precisa y robusta de identificar estados del historial.[cite:55]
Diagrama conceptual de integridad¶
Antes del siguiente análisis, observa la relación entre contenido, hash e integridad.
flowchart TD
A[Contenido del commit] --> B[Git calcula hash]
B --> C[El commit obtiene una identidad única]
C --> D[Git puede verificar integridad e historial]
Este flujo resume por qué los hashes son tan valiosos. No son un detalle secundario: permiten que Git identifique, relacione y verifique el contenido del repositorio.[cite:49][cite:55]
Por qué esto hace a Git más seguro y confiable¶
La integridad basada en hash significa que Git puede detectar si algo no coincide con lo que debería haber sido almacenado. Esa capacidad refuerza la confianza en el historial y en la consistencia de los datos.[cite:49]
Por eso Git no solo es rápido. También es robusto.
Error común¶
Un error frecuente es pensar que el hash es solo un “nombre raro” del commit. En realidad, es mucho más que eso: es parte del mecanismo que permite a Git identificar y proteger la estructura del historial.[cite:49][cite:55]
Curiosidad
La documentación oficial muestra ejemplos de hashes de 40 caracteres hexadecimales y explica que Git usa estos valores en muchos lugares porque los emplea para referirse a los objetos de su base de datos.[cite:49]
Consejo
No intentes memorizar hashes. Lo importante, al empezar, es comprender para qué existen: identificar commits de forma única y ayudar a preservar la integridad del historial.
Breve conclusión: un hash es la huella digital del contenido dentro de Git. Gracias a él, cada commit tiene una identidad única y el historial puede conservarse con una gran garantía de integridad.
3.7 El ciclo completo de un cambio¶
Ahora que ya conoces los componentes principales, es momento de recorrer el flujo completo de un cambio dentro de Git. Esta sección une todo lo aprendido hasta ahora: Working Directory, Staging Area, Local Repository, commits, HEAD e integridad basada en hashes.[cite:49][cite:55]
El flujo general¶
El recorrido conceptual pedido en este capítulo es el siguiente:
Modificar archivo
↓
Working Directory
↓
git add
↓
Staging Area
↓
git commit
↓
Repositorio
↓
HEAD
Lo importante no es repetirlo de memoria, sino comprender qué ocurre en cada etapa.
Paso 1: modificar un archivo¶
Todo comienza cuando cambias un archivo real del proyecto, por ejemplo index.html o README.md. Ese cambio vive primero en tu entorno de trabajo. Aún no pertenece al historial; es solo una edición activa dentro del Working Directory.[cite:49]
Ejemplo:
se convierte en:
Ese cambio ya existe en el proyecto, pero todavía no está preparado ni comprometido.
Paso 2: el cambio entra en el Working Directory¶
El Working Directory contiene ahora una versión modificada del archivo. Si consultas git status, Git te dirá que el archivo fue modificado respecto al último commit.[cite:49]
En esta etapa, el cambio es real, pero aún es trabajo en curso.
Paso 3: git add¶
Cuando decides que esa modificación debe formar parte del siguiente commit, utilizas git add. Git toma la versión actual del archivo y la lleva a la Staging Area como parte de la próxima instantánea.[cite:49]
Esto no borra el archivo del Working Directory ni crea todavía un commit. Solo selecciona el estado actual del contenido.
Paso 4: el cambio entra en la Staging Area¶
Ahora el archivo ya está preparado. Eso significa que, si en este instante ejecutaras git commit, esa versión sería incluida en el nuevo punto del historial.[cite:49]
Si vuelves a modificar el archivo después, la nueva edición permanecerá solo en el Working Directory hasta que la prepares otra vez. Ésta es una de las razones por las que Git ofrece tanto control.[cite:49]
Paso 5: git commit¶
Cuando ejecutas git commit, Git toma el contenido preparado en la Staging Area y lo almacena como una nueva instantánea en el repositorio local. Ese nuevo estado pasa a formar parte permanente del historial.[cite:49]
Aquí es donde la historia crece de verdad.
Paso 6: el cambio llega al repositorio¶
Después del commit, el cambio deja de ser solo una intención preparada. Ya es un estado registrado del proyecto dentro del Local Repository. Git lo identifica, lo conecta con el historial previo y lo conserva con integridad.[cite:49][cite:55]
Paso 7: HEAD avanza¶
Una vez creado el commit, HEAD pasa a señalar este nuevo punto de la historia. Así, Git sabe cuál es el estado actual confirmado del proyecto sobre el que se apoya tu trabajo.[cite:55]
Diagrama principal del ciclo completo¶
Antes del desarrollo práctico, observa el flujo completo en un solo esquema.
flowchart LR
A[Modificar index.html] --> B[Working Directory]
B --> C[git add]
C --> D[Staging Area]
D --> E[git commit]
E --> F[Local Repository]
F --> G[HEAD apunta al nuevo commit]
Este diagrama es el corazón conceptual del capítulo. Resume cómo un cambio pasa de ser edición local a convertirse en parte del historial oficial del proyecto.[cite:49][cite:55]
Ejemplo práctico con el proyecto del libro¶
Imagina este recorrido sobre README.md:
- Agregas una línea que describe mejor el propósito del sitio web personal.
- Ejecutas
git statusy Git muestra el archivo como modificado.[cite:49] - Ejecutas
git add README.mdy el archivo queda preparado.[cite:49] - Ejecutas
git commit -m "Mejorar descripción del proyecto en README". - El nuevo commit queda guardado en el repositorio local.[cite:49]
- HEAD pasa a apuntar a ese commit.[cite:55]
Si luego consultas git log, verás esa nueva etapa integrada al historial.[cite:49]
Un segundo diagrama: recorrido de un archivo¶
Conviene ver ahora el recorrido de un archivo concreto dentro del sistema.
flowchart TD
A[index.html modificado] --> B[Git lo detecta en Working Directory]
B --> C[Se prepara con git add]
C --> D[Su versión actual entra a Staging Area]
D --> E[git commit crea una instantánea]
E --> F[El archivo queda incluido en un nuevo commit]
Este flujo deja claro que el archivo no “salta” mágicamente al historial. Recorre etapas con significado específico.[cite:49]
Qué hace a este ciclo tan potente¶
Este modelo ofrece velocidad, seguridad y claridad:
- velocidad, porque la mayoría de las operaciones son locales;[cite:49]
- seguridad, porque Git controla integridad mediante hashes;[cite:49]
- claridad, porque separa edición, preparación y confirmación.[cite:49]
Error común en esta etapa¶
Un error típico es intentar entender Git como si Working Directory, Staging Area y repositorio fueran lo mismo. No lo son. El cambio se va moviendo por capas distintas, y cada capa tiene una función muy concreta.[cite:49]
Buenas prácticas
Cada vez que modifiques un archivo, pregúntate en qué etapa del flujo está: ¿solo modificado?, ¿ya preparado?, ¿ya convertido en commit? Esa simple pregunta reduce mucha confusión.
Breve conclusión: el ciclo de un cambio en Git va desde la edición local hasta el historial confirmado. Comprender este recorrido completo transforma Git de una lista de comandos en un sistema lógico y predecible.
3.8 Comprendiendo el historial¶
Una vez que entiendes cómo nace un commit, estás listo para comprender mejor el historial. Git no construye una colección caótica de guardados. Construye una línea temporal de estados del proyecto, donde cada commit representa un punto significativo y queda relacionado con los anteriores.[cite:49][cite:55]
El historial como línea temporal¶
La documentación oficial de revisiones explica que, cuando se especifica un commit, Git entiende también el conjunto de commits alcanzables desde él, es decir, el commit mismo y su cadena de ancestros.[cite:55] Esta idea muestra algo fundamental: los commits no viven aislados. Forman parte de una estructura histórica conectada.
Puedes pensar en ello como una cadena de capítulos dentro de una misma historia. Cada capítulo depende de que exista uno anterior y prepara el terreno para el siguiente.
Cómo cada commit depende del anterior¶
En un flujo lineal como el que estás siguiendo en este libro, cada nuevo commit se apoya en el anterior. Por eso el historial puede leerse como una secuencia de estados que evolucionan paso a paso.[cite:55]
En el proyecto sitio-web-personal, eso significa que el commit donde creaste la estructura inicial dio pie al commit donde mejoraste README.md, y éste a su vez dio pie al commit donde refinaste index.html. El proyecto no salta entre versiones desconectadas: avanza dentro de una continuidad.[cite:49][cite:55]
Qué significa “viajar en el tiempo”¶
A menudo se dice que Git permite “viajar en el tiempo”. En esta etapa no necesitamos profundizar en los mecanismos para hacerlo. Basta con entender la idea: como el historial está construido con commits conectados e identificables, Git puede mirar hacia atrás y referirse a estados anteriores del proyecto.[cite:55]
Eso no sería posible con una simple colección de archivos sobrescritos sin estructura clara.
Por qué el historial tiene tanto valor¶
El historial sirve para mucho más que nostalgia técnica. Permite:
- revisar cómo fue creciendo el proyecto;
- entender qué cambios ocurrieron y en qué orden;
- localizar puntos importantes del desarrollo;
- trabajar con mayor confianza porque el pasado del proyecto no desaparece.[cite:49][cite:55]
Evolución del historial del proyecto del libro¶
Hasta este punto, tu sitio web personal ya puede tener varios commits encadenados. Un historial posible sería:
- creación de la estructura inicial del proyecto;
- incorporación de una descripción inicial en
README.md; - actualización de contenido en
index.html; - mejora del encabezado principal;
- refinamiento del texto de bienvenida.
Cada commit añade una nueva capa a la evolución del proyecto. Juntos forman una línea temporal comprensible.[cite:49]
Diagrama de evolución del historial¶
Antes del siguiente cierre, observa el historial como una secuencia encadenada de estados.
flowchart LR
A[Commit: estructura inicial] --> B[Commit: README inicial]
B --> C[Commit: contenido principal]
C --> D[Commit: mejora de encabezado]
D --> E[Commit: refinamiento de presentación]
H[HEAD] --> E
Este diagrama muestra dos ideas al mismo tiempo: el historial evoluciona como una cadena de commits y HEAD marca el punto actual de esa cadena.[cite:55]
Un segundo diagrama: historia como línea temporal¶
Conviene reforzar la idea con una visualización aún más conceptual.
timeline
title Evolución del sitio web personal en Git
Commit 1 : Estructura inicial del proyecto
Commit 2 : README con descripción inicial
Commit 3 : Primera mejora de index.html
Commit 4 : Ajuste del encabezado principal
Commit 5 : Mejora del mensaje de bienvenida
Esta línea temporal ayuda a entender que el historial de Git no es una acumulación desordenada. Es una narración estructurada de la evolución del proyecto.
Cómo leer mejor el historial¶
Cuando consultes git log, intenta no verlo solo como una lista de identificadores y fechas. Léelo como si fuera la historia resumida de decisiones importantes tomadas sobre el sitio web personal.[cite:49]
Cuanto más claros sean tus commits y tus mensajes, más útil será esa lectura.
Consejo
Un buen historial debería poder leerse casi como una explicación breve de cómo fue creciendo el proyecto.
Error común
Pensar que el historial solo sirve para “deshacer cosas”. También sirve para comprender, documentar y dar contexto a la evolución del proyecto.[cite:49][cite:55]
Por qué esta comprensión cambia tu forma de usar Git¶
Cuando entiendes el historial como una línea temporal conectada, Git deja de ser intimidante. Ya no parece una herramienta llena de comandos aislados, sino un sistema que construye memoria estructurada del proyecto.
Eso es precisamente lo que necesitas antes de avanzar a temas posteriores: una imagen mental clara del interior de Git.
Breve conclusión: el historial de Git es una línea temporal conectada de commits. Cada commit depende del anterior, HEAD marca la posición actual y esa estructura hace posible revisar y comprender la evolución del proyecto.
Práctica guiada¶
En esta práctica guiada no se busca memorizar comandos, sino observar conscientemente qué ocurre dentro de Git mientras trabajas con el repositorio del sitio web personal. La idea es usar los mismos pasos ya conocidos, pero ahora con una mirada mucho más interna.
Paso 1: modifica README.md¶
Abre README.md y mejora una línea de descripción del proyecto. No hagas todavía un commit. Primero piensa: el cambio existe en el Working Directory.
Después ejecuta:
Observa cómo Git indica que el archivo fue modificado. En este momento el cambio no pertenece al historial; vive solo en tu zona de trabajo.[cite:49]
Paso 2: prepara README.md¶
Ahora ejecuta:
Vuelve a consultar el estado:
Aquí debes fijarte en la transición conceptual: el archivo sigue existiendo en tu Working Directory, pero además su versión actual ya fue capturada en la Staging Area.[cite:49]
Paso 3: modifica otra vez el mismo archivo¶
Sin hacer commit todavía, vuelve a cambiar README.md. Agrega una segunda frase o corrige una palabra. Luego ejecuta otra vez:
Lo importante aquí es comprender el resultado: Git puede mostrar que el archivo está preparado y modificado al mismo tiempo, porque la Staging Area conserva una instantánea anterior mientras el Working Directory ya contiene cambios nuevos.[cite:49]
Paso 4: actualiza la preparación¶
Ejecuta nuevamente:
Con esto actualizas en la Staging Area la versión del archivo que quieres llevar al próximo commit.[cite:49]
Paso 5: crea el commit¶
Ahora registra el cambio con un mensaje claro:
Piensa en lo que acaba de ocurrir internamente:
- Git tomó la instantánea de la Staging Area;[cite:49]
- la guardó como commit en el repositorio local;[cite:49]
- HEAD pasó a señalar ese nuevo commit.[cite:55]
Paso 6: repite el proceso con index.html¶
Haz una pequeña mejora real en index.html, por ejemplo en el encabezado principal o en el párrafo de bienvenida.
Luego recorre conscientemente el flujo:
Cada vez, pregúntate en qué zona está el cambio: Working Directory, Staging Area o repositorio local.
Paso 7: consulta el historial¶
Finalmente, revisa cómo la historia del proyecto ha crecido:
Observa cómo cada commit aparece como un punto nuevo de la línea temporal del proyecto y cómo Git lo identifica con un hash.[cite:49][cite:55]
Tabla de observación recomendada¶
Puedes usar la siguiente tabla mental durante la práctica:
| Acción | Dónde está el cambio | Qué significa |
|---|---|---|
| Editar archivo | Working Directory | El cambio existe, pero aún no está preparado |
Ejecutar git add |
Staging Area | La versión actual quedó lista para el próximo commit |
Ejecutar git commit |
Local Repository | El cambio ya forma parte del historial |
Consultar git log |
Historial | Puedes ver cómo evolucionó el proyecto |
| Pensar en el commit actual | HEAD | Git sabe cuál es el punto actual del historial |
Resultado esperado¶
Al completar esta práctica, deberías haber logrado lo siguiente:
- Modificar archivos del proyecto.
- Consultar
git statusdespués de cada modificación.[cite:49] - Preparar archivos con
git add.[cite:49] - Crear varios commits.[cite:49]
- Consultar el historial con
git log.[cite:49][cite:55] - Visualizar el recorrido completo de los cambios.
[Ilustración: infografía moderna que muestre el recorrido de un archivo README.md desde edición en el editor, paso por Working Directory, preparación en Staging Area, creación del commit en el repositorio local y actualización de HEAD]
Breve conclusión: la práctica guiada de este capítulo no enseña un comando nuevo, sino una forma nueva de mirar Git. Cada acción del flujo local tiene una etapa interna precisa y entenderla te dará mucha más seguridad en los capítulos siguientes.
Cierre del capítulo¶
En este capítulo profundizaste en la maquinaria conceptual que hace funcionar a Git. Ahora sabes que Git no guarda simplemente archivos: registra instantáneas del proyecto, mantiene un historial local, usa un área intermedia para preparar cambios, conserva integridad mediante hashes y se orienta dentro del historial con la referencia HEAD.[cite:49][cite:55]
También viste por qué Git resulta rápido, seguro y confiable. Es rápido porque la mayoría de sus operaciones se realizan localmente; es seguro porque verifica el contenido mediante checksums; y es confiable porque construye un historial estructurado, no una colección improvisada de copias.[cite:49]
A partir de este punto, el flujo básico de Git ya no debería sentirse como una secuencia arbitraria de comandos. Debería sentirse como un proceso lógico: trabajar en el Working Directory, seleccionar cambios en la Staging Area, registrarlos en el repositorio local y avanzar la historia del proyecto con claridad. Esa comprensión será la base ideal para continuar el recorrido del libro.