En la primavera de 2005, la comunidad del núcleo de Linux perdió BitKeeper, y en solo unas semanas apareció algo que cambió los hábitos de los programadores de todo el mundo. Veamos por qué ganó Git, cómo funciona por dentro y qué pueden aprender los principiantes de esto.
TL;DR: Git son instantáneas, un grafo (DAG) y ramas baratas. Como resultado, velocidad, fiabilidad y libertad de trabajo sin conexión.
Antes de Git: control de versiones centralizado y sus limitaciones 🧯
CVS/SVN se basaban en un servidor central: sin red, no hay confirmaciones.
Las ramas eran «costosas», las fusiones eran dolorosas; los equipos a menudo se demoraban en experimentar.
El pensamiento de «dif a todos los archivos» en lugar de «instantánea del estado del proyecto» complicaba la historia.
Para el núcleo de Linux, con miles de parches al mes, esto se convirtió en un cuello de botella.
Por qué apareció Git y cómo debería haber sido ⚙️
📦 Distribución: una copia completa del historial de todos; confirmaciones y ramas sin conexión.
⚡ Velocidad: operaciones locales instantáneas en historias enormes.
🧪 Fiabilidad: integridad criptográfica de la historia a través de hashes.
🌿 Ramas baratas: crear, cambiar, fusionar es una rutina, no un evento.
Ideas clave de Git que lo cambiaron todo 💡
Instantáneas en lugar de diffs: un commit es una instantánea del estado del proyecto, no un conjunto de parches.
Árbol de Merkle: los objetos (
blob,tree,commit,tag) están vinculados por hashes: la historia es integral.Ramas — indicadores: son solo enlaces a confirmaciones; las operaciones son instantáneas.
Historia de DAG: las fusiones son una operación normal y barata, no un «heroísmo».
Trabajo local: confirmaciones, registros, comparaciones: sin red; sincronización:
push/pull.
# Imagen mental
(main)─A─B─C
╲
(feature) D─E ← ветка — это указатель; merge/rebase двигают ссылкиBajo el capó: el modelo de objetos de Git 🧬
Objeto | Qué almacena | ¿Por qué? |
|---|---|---|
| Contenido del archivo | Direccionamiento de contenido y deduplicación |
| Enlaces a archivos y carpetas | Estructura del catálogo en el momento del compromiso |
| Enlace a | Foto + lugar en la historia |
| Enlace firmado al objeto | Lanzamientos e «hitos» |
Históricamente, SHA-1; los ensamblajes modernos pueden usar SHA-256. En cualquier caso, el hash «pega» la historia.
Minicurso de 30 minutos 🛠️
Crea un repositorio:
git init, añade dos archivos, haz 2-3 pequeños commits.Ramifica:
git switch -c feature, cambia el archivo, confirma.Vierta en
main:git switch main && git merge feature.Mira el historial:
git log --graph --oneline --decorate.Juega a ser detective:
git bisecten una bolsa artificial.Edite la historia localmente:
git rebase -i HEAD~3(squash/rename). ¡No lo hagas sin un acuerdo!
# Sugerencia de comandos
git init
git add .
git commit -m "init"
git switch -c feature
# ... modificaciones ...
git commit -m "feature: add X"
git switch main
git merge feature
git log --graph --oneline --decorateErrores típicos de los principiantes y soluciones rápidas 🧭
🔗 Detached HEAD — siempre crea una rama antes del experimento:
git switch -c exp.♻️ Rebase vs merge — rebase reescribe la historia; en general, en repo, usa merge más a menudo.
📦 Archivos grandes — almacena artefactos a través de Git LFS o tiendas externas.
↩️ Sobornos — más seguro
git revert(nueva confirmación), noreset --hard.
En Codice hacemos que el aprendizaje de la programación sea emocionante y comprensible: tenemos cursos interesantes con tareas que ayudan a mejorar las habilidades paso a paso.
Y también tenemos un canal de telegram, donde discutimos ideas geniales, compartimos experiencias y analizamos juntos las tareas: aprender no solo es útil, sino también divertido.
Resultados: lo que nos enseña la historia de Git 🧰
Git nació del dolor real del desarrollo a gran escala del núcleo de Linux, por lo que es tan bueno en las ramas y las fusiones.
Las instantáneas + DAG eliminan el velo «mágico»: empieza a pensar en historias, no en paquetes de diferencias.
Haz ramas cortas y confirmaciones frecuentes: Git se desarrolla en este proceso.
¿Cuál es tu primer «rastrillo» en Git: HEAD desvinculado, conflictos de rebase o una confirmación «desaparecida»?
