Introducción: La Crisis de un Ecosistema
Déjame contarte una historia. Corría el año 2002. El kernel de Linux ya era un proyecto masivo, un gigante de código abierto con miles de colaboradores por todo el mundo. Pero teníamos un problema, un problema "existencial". Nuestro método para gestionar todo ese código era, francamente, arcaico. Dependíamos de enviar "parches" (archivos de texto con cambios) por correo electrónico. Yo, o alguno de mis lugartenientes, teníamos que revisar y aplicar cada parche a mano. Era un cuello de botella monumental y un trabajo insostenible. El proyecto se estaba ahogando en su propio éxito.
La solución obvia, un "Sistema de Control de Versiones" (VCS), no servía. Las herramientas de la época, como CVS o Subversion (SVN), eran centralizadas. Estaban hechas para equipos pequeños que trabajaban en la misma oficina, no para una red global y asíncrona como la nuestra. Cada "commit" requería una conexión al servidor central. Eran lentos, torpes, y crear ramas (algo esencial para nosotros) era una pesadilla.
Demo: El Cuello de Botella Centralizado
Modelo Centralizado (CVS/SVN)
Todas las operaciones dependen de un servidor central lento.
Nuestro Modelo (Distribuido)
(Copia)
(Copia)
(Copia)
Cada desarrollador tiene una copia local completa y rápida.
El Pacto con BitKeeper
Harto de las herramientas de código abierto, que consideraba inútiles, tomé una decisión pragmática y controvertida. En 2002, empecé a usar una herramienta propietaria llamada "BitKeeper". ¿Por qué? Porque era la única que entendía el "modelo distribuido". Cada desarrollador tenía una copia local completa. Podíamos trabajar sin conexión, hacer commits locales y fusionar cambios entre nosotros. La productividad se disparó. El kernel 2.6 fue posible gracias a BitKeeper.
Pero tenía un coste. Usar software propietario para el proyecto insignia del software libre era... controvertido. BitMover, la empresa creadora, nos lo dejaba usar gratis, pero con una condición: no podíamos trabajar en ninguna herramienta de la competencia (ni CVS, ni SVN, ni nada). Fue un pacto faustiano. Sabíamos que, probablemente, acabaría mal.
2005: El Punto de Quiebre
Y, por supuesto, acabó mal. En 2005, la inevitable colisión ocurrió. Un desarrollador brillante de nuestra comunidad, Andrew Tridgell (creador de Samba), decidió hacer ingeniería inversa al protocolo de BitKeeper para crear un cliente de código abierto compatible. No estaba robando código, solo intentaba interoperar.
Para Larry McVoy, el jefe de BitMover, esto fue una violación directa de la licencia. Lo vio como una amenaza a su negocio y, de la noche a la mañana, revocó nuestra licencia gratuita. De repente, el desarrollo del kernel de Linux se quedó paralizado. La herramienta que nos había hecho productivos nos fue arrebatada. No podíamos volver a los parches por email, y las otras herramientas seguían sin servir. Estábamos en una crisis total. Así que hice lo único que podía hacer: paré todo mi trabajo en el kernel y me encerré a crear una solución.
Mi Filosofía de Diseño
Mi visión estaba forjada por la frustración. Odiaba CVS y pensaba que SVN era inútil. Mi nueva herramienta sería lo opuesto. Tenía tres pilares innegociables:
1. Distribuido
Cada desarrollador tendría el historial completo. La colaboración se basaría en "tirar" (pull) de cambios por confianza, no en permisos de escritura centralizados. Crear ramas sería trivial.
2. Rápido (Muy Rápido)
No iba a esperar minutos por una operación. Hablaba de milisegundos. Si tenías tiempo de ir a por un café, la herramienta era un fracaso. La velocidad era la característica principal.
3. Integridad Absoluta
No podía confiar en que el hardware no corrompiera los datos. Todo el contenido y el historial estarían protegidos criptográficamente (con hashes SHA-1). Imposible de corromper.
Diez Días de Creación: El Núcleo de Git
En unos diez días de abril de 2005, escribí el núcleo de lo que llamé "Git" (un término del argot británico para "idiota", porque así me sentía por tener que escribirlo). No lo pensé como un VCS, lo pensé como un "sistema de archivos" optimizado.
En lugar de guardar "diferencias" entre archivos (deltas), Git toma una "instantánea" (snapshot) de todo el proyecto en cada commit. Esto suena lento, pero es rapidísimo gracias a tres objetos simples:
Demo: La Anatomía de un Commit
-> 7c4a (fich2.txt)
(Autor, Fecha...)
padre: (Puntero al Commit 1)
- Blob: Es el contenido de un archivo. Si dos archivos tienen el mismo contenido, solo se guardan una vez.
- Tree: Es un directorio. Contiene punteros a Blobs (archivos) y otros Trees (subdirectorios).
- Commit: Es una instantánea. Contiene un puntero al Tree principal, información (autor, mensaje) y, lo más importante, un puntero a sus "commits padres".
Una "rama" (branch) no es más que un simple puntero móvil que apunta a un commit. Por eso es tan increíblemente rápido y barato crear y fusionar ramas. Resolví mi problema.
El Legado: De Herramienta Personal a Estándar Global
En cuanto Git fue funcional para el kernel, cedí su mantenimiento a Junio C. Hamano, que ha hecho un trabajo increíble desde entonces. Yo no quería mantenerlo; yo solo quería usarlo.
Al principio, la gente pensaba que Git era demasiado complicado. Pero entonces, la comunidad de Ruby on Rails lo adoptó. Y en 2008, ocurrió el verdadero catalizador: **nació GitHub**. GitHub no cambió Git, pero le dio una interfaz web amigable y popularizó el flujo de trabajo de "Fork" y "Pull Request", un modelo de colaboración social perfecto construido sobre la arquitectura distribuida de Git.
La combinación fue explosiva. La herramienta técnicamente superior (Git) se unió a la plataforma socialmente accesible (GitHub). El resto es historia. La herramienta que escribí en diez días por pura rabia y necesidad, ahora es la base sobre la que se construye casi todo el software del mundo.
Demo: La Adopción Masiva de Git
Conclusión
La historia de Git es una lección de innovación. No me propuse revolucionar el control de versiones; me propuse resolver un problema que me impedía trabajar. Al final, los principios de velocidad, integridad y distribución crearon una herramienta que no solo facilitó el desarrollo, sino que permitió formas de colaboración que antes eran imposibles. Y de paso, demostré que Linux no fue una casualidad.