Git, control de versiones distribuido

Como he comentado anteriormente, actualmente utilizo Git como repositorio para todo el contenido de este blog, allí almaceno tanto los archivos de configuración como el contenido en sí (texto e imagenes) que luego generan el sitio web funcional usando Hugo   . Más allá de este uso concreto, considero que conocer Git es fundamental para profesionales de TI, así que me propuse escribir esta introducción respecto a la herramienta.

¿Qué es Git?

Git   es un Sistema de Control de Versiones Distribuido (DVCS), creado originalmente por Linus Torvalds (el creador de Linux) en 2005.

En esencia, Git es una herramienta que rastrea los cambios realizados en archivos a lo largo del tiempo. Permite a los desarrolladores volver a versiones anteriores de un proyecto, ramificar el desarrollo para trabajar en nuevas características sin afectar el código principal, y fusionar esos cambios de vuelta de manera controlada cuando lo consideren adecuado. ``

Puntos Clave:

  • Control de Versiones: Significa que registra cada modificación en el código, permitiéndote saber quién cambió qué, y cuándo.

  • Distribuido: Esta es la característica más importante. A diferencia de sistemas centralizados, cada desarrollador tiene una copia completa de todo el historial del proyecto en su máquina local. Esto significa que puedes trabajar sin conexión y que el proyecto no depende de un único servidor central (lo cual aumenta la resiliencia y la seguridad).

¿Cómo Funciona Git?

Git no almacena la información como una lista de archivos que cambian a lo largo del tiempo. En su lugar, almacena la información como un conjunto de instantáneas (snapshots) del sistema de archivos.

1. El Modelo de Tres Árboles (o Tres Estados)

Git gestiona el proyecto en tres estados principales o “árboles” lógicos:

EstadoNombre (en Git)Descripción
1. Directorio de TrabajoWorking DirectoryLos archivos que tienes en tu máquina y que estás modificando. Estos archivos son descontrolados (no rastreados) o modificados (rastreados, pero no guardados).
2. Área de PreparaciónStaging Area (Index)Es un caché intermedio. Aquí pones los cambios específicos del Directorio de Trabajo que quieres incluir en tu próximo commit.
3. Repositorio LocalGit Directory (Repository)Es la base de datos de Git, que contiene el historial de todos los cambios (commits) del proyecto. Es donde se almacenan las instantáneas de manera permanente.

2. El Commit (Instantánea)

Un commit es la acción fundamental. Es una instantánea o punto de control de tu proyecto en un momento específico.

  • Para crear un commit, primero debes mover los archivos modificados del Directorio de Trabajo al Área de Preparación (comando git add).
  • Luego, creas el commit (comando git commit), moviendo esos archivos desde el Área de Preparación al Repositorio Local.
  • Cada commit tiene un hash SHA-1 único que lo identifica, un mensaje descriptivo y un puntero al commit inmediatamente anterior (su “padre”).

3. Ramas (Branches)

Las ramas son punteros ligeros y movibles a un commit. Permiten a los desarrolladores:

  • Crear una línea de desarrollo separada del código principal (main o master).
  • Trabajar en una nueva característica o corrección de error sin riesgo de romper la versión estable.
  • Una vez que el trabajo está listo, se puede fusionar (merge) esa rama de vuelta a la línea principal.

¿Por qué es importante Git?

Más allá del uso que puede darle un desarrollador de software, en lo cual no me centraré aquí, considero que Git ofrece varios beneficios para administradores de sistemas o especialistas en diferentes ramas de TI:

  1. Auditoría y Trazabilidad: En seguridad y cumplimiento, la trazabilidad es vital. Git proporciona un registro inmutable de todos los cambios. Si se introduce una vulnerabilidad o una configuración incorrecta, sabes exactamente qué commit lo causó, quién lo hizo y cuándo, facilitando la auditoría y el rollback.
  2. Infraestructura como Código (IaC): Herramientas como Terraform, Ansible o CloudFormation utilizan Git para almacenar su configuración. Esto es fundamental para el DevSecOps y para gestionar entornos de nube de manera segura y reproducible.
  3. Colaboración y Resiliencia: Permite que equipos distribuidos colaboren en el mismo código de manera segura, sin riesgo de sobrescribirse el trabajo mutuo. Al ser distribuido, si un servidor central falla (ej. GitLab, del que hablaremos en otra publicación), el historial completo sigue existiendo en las máquinas locales de quienes estén colaborando.
  4. Flujo de Trabajo (CI/CD): Git es el motor central de la mayoría de los pipelines de Integración Continua y Despliegue Continuo (CI/CD), asegurando que solo el código revisado y probado llegue a producción. Por ejemplo en el caso de este blog: uso un proyecto en GitLab como repositorio de código, para luego mediante un flujo de CI/CD desplegar el sitio funcional en Cloudflare Pages.

Por lo tanto, Git puede aportar valor para tareas tan diversas como gestionar infraestructura como código, gestión de configuraciones en servidores, orquestación de contenedores/Kubernetes, o simplemente gestión de documentación (en lo personal lo he usado para políticas de seguridad y otros documentos).

Estos usos demuestran que Git es una herramienta de gestión de conocimiento y arquitectura tan importante como una herramienta de programación. Permite aplicar los principios de trazabilidad y auditoría, esenciales en ciberseguridad, a todos los aspectos de un sistema.


Próximamente pretendo escribir algo sobre GitLab, una de los servidores Git que suelo usar para proyectos personales y laborales. Y en cuanto tenga algo más de tiempo, documentar por aquí el despliegue completo de este blog con CI/CD usando Hugo + GitLab + Cloudflare Pages.