Veinte años no son nada

El control de versiones ha evolucionado desde sistemas centralizados y basados en bloqueos como SourceSafe y CVS hasta el modelo distribuido de Git, con el historial en todas partes, que muchos ven como una meseta transformadora pero imperfecta. Los comentaristas comparan la velocidad y robustez de Git con su UX confusa, su mala gestión de repositorios muy grandes o llenos de binarios, y su falta de historial semántico o sensible al AST, y señalan alternativas como Mercurial, Fossil, Pijul, jj y diseños basados en CRDT como intentos de cerrar esas brechas. El intercambio también destaca cómo las decisiones de implementación (por ejemplo, Rust frente a Python), los patrones de flujo de trabajo (rebase, commits apilados) y las plataformas de alojamiento (GitHub frente a autoalojado) moldean tanto la calidad de las herramientas como la cultura de desarrollo.

Lenguajes de implementación y “escrito en Rust”

  • Debate repetido sobre por qué los proyectos anuncian “escrito en Rust”.
  • Los defensores dicen que la elección del lenguaje señala:
    • Seguridad de memoria y velocidad sin GC.
    • Binarios estáticos y autocontenidos, y herramientas fluidas.
    • Una cultura de desarrollo que valora la corrección y el rendimiento.
  • Los escépticos lo ven como marketing débil: si “escrito en Rust” es el titular, quizá haya poco más que diferencie el proyecto.
  • Algunos señalan que el lenguaje es predictivo del estilo del proyecto y de su encaje en el ecosistema (por ejemplo, es más fácil contribuir si conoces Rust/Go que Python).
  • Críticas a Python/JS por rendimiento y estabilidad a largo plazo; se menciona que Go es similar a Rust en distribución, pero no en garantías de tipos/propiedad.

Pijul, VCS basados en parches e ideas de CRDT

  • Se destaca Pijul y Fossil como verdaderas alternativas a Git con diseños distintos; jj y Sapling se ven más como interfaces mejoradas para Git/Mercurial.
  • El autor de Pijul explica:
    • El diseño se basa en parches/CRDT; los conflictos forman parte del modelo.
    • Las estructuras de datos se diseñaron “como teóricos”, y luego se optimizaron.
    • Un almacén clave-valor propio en Rust (Sanakirja) permite un almacenamiento rápido, genérico, amigable con mmap y bifurcaciones eficientes, superando a LMDB en sus benchmarks.
    • Rust se eligió pragmáticamente por el control de bajo nivel sin el dolor de depuración de C++; hoy quizá elegiría Zig debido a la evolución del lenguaje.
  • Algunos argumentan que los VCS basados en parches pueden ser más rápidos que Git, basado en snapshots, para repos grandes, conflictos, blame y archivos binarios.

Fortalezas, debilidades y flujos de trabajo de Git

  • Muy elogiado por:
    • Velocidad frente a herramientas más antiguas.
    • Flujo de trabajo distribuido y commits sin conexión.
    • Flexibilidad y un potente modelo de datos.
  • Críticas:
    • La UX de la CLI es confusa; los conceptos filtran detalles de la implementación interna.
    • Rebase, reescritura de historial y flujos con commits apilados son difíciles; herramientas como Gerrit/Graphite/jj intentan mitigarlo.
    • Git almacena snapshots, no un historial explícito de cambios; los renombres/splits de archivos y las grandes refactorizaciones son difíciles de seguir.
    • No hay directorios vacíos; el historial de splits/merges de archivos y movimientos semánticos es débil.
    • Git LFS es visto por algunos como frágil y operativamente incómodo.

Centralización, tamaño del historial y clones parciales

  • Debate sobre si los clones locales con historial completo eran “impensables” hace 20 años; algunos recuerdan CVS/SVN junto con scripts locales y discos lo bastante grandes, mientras otros enfatizan las limitaciones de red y almacenamiento de la época.
  • Se señala que DVCS implica un límite práctico: el historial del repositorio debe caber en el portátil más pequeño de desarrollo.
  • Algunos sostienen que la mayoría de las organizaciones son de facto centralizadas y se beneficiarían de clones jerárquicos/subordinados: historial parcial, árboles parciales, pero manteniendo ramas y commits locales.
  • Se mencionan las funciones más recientes de Git partial clone y sparse-checkout como soluciones parciales.

Activos binarios y proyectos no textuales

  • El modelo centrado en texto de Git funciona bien para la mayoría del software, pero:
    • Los videojuegos, el diseño de chips y las canalizaciones de medios siguen prefiriendo Perforce o SVN por los binarios grandes.
    • Git LFS es criticado por ser propenso a bugs, complejo operativamente y requerir componentes extra del servidor.
    • Se desea un VCS que entienda de forma nativa formatos binarios (por ejemplo, diffs semánticos para imágenes) y almacenamiento de archivos grandes; Pijul afirma tener soporte binario nativo.

Futuros semánticos, sensibles al AST y basados en CRDT

  • Varios comentaristas sugieren:
    • Control de versiones sobre ASTs o estructuras específicas del dominio en lugar de texto bruto.
    • Mejores diffs/conflictos que entiendan movimientos, renombres y refactors.
  • Una propuesta: un sucesor de Git que almacene historiales CRDT a nivel de carácter, con colaboración en tiempo real y commits semánticos; los problemas abiertos incluyen cómo mostrar conflictos y la eliminación de datos (secretos).
  • Otros sostienen que esa granularidad puede añadir ruido y complejidad; los commits como puntos de control elegidos por humanos siguen siendo valiosos.

Herramientas históricas y perspectiva

  • Numerosas reminiscencias de VSS, ClearCase, Perforce, CVS, SVN, RCS, BitKeeper y versionado improvisado con zip/tar.
  • Los sistemas centralizados basados en bloqueos (VSS, algunas configuraciones de ClearCase/Perforce) se recuerdan como dolorosos, aunque alguna vez se consideraron “profesionales”; los flujos de código abierto con CVS/SVN se veían por delante de muchas empresas.
  • Sensación general de que cada generación pensó que sus herramientas eran buenas hasta que el siguiente gran paso (SVN, luego Git/DVCS) expuso sus límites.

¿Reemplazará algo a Git?

  • Algunos piensan que Git es una meseta evolutiva; los sucesores necesitarían:
    • Compatibilidad total con Git y uso transparente sobre repos existentes.
    • UX más simple y mejor semántica (renombres, operaciones sensibles al AST, commits apilados).
    • Mejor manejo de repos grandes y binarios.
  • Otros esperan un desplazamiento eventual, citando la larga historia de rotación en los VCS; aun así, los efectos de red de Git y su estatus de “suficientemente bueno” podrían mantenerlo dominante durante mucho tiempo.