Git 2.56: nuevo modo de resolución de conflictos, mejoras de rendimiento y git-history

Se dio a conocer el lanzamiento de la nueva version de Git 2.56, esta entrega incluye 748 modificaciones desarrolladas por 104 contribuidores y destaca por un nuevo modo seguro para gestionar conflictos, drásticas aceleraciones en repositorios masivos, y la expansión de utilidades como git-history y git-refs.
Adicionalmente, esta versión marca el comienzo de la ruta de transición hacia Git 3.0, planeado para la primavera de 2027.
Principales novedades de Git 2.56
En el caso específico de SHA-256, uno de los mayores inconvenientes era la falta de soporte en las plataformas de replicación. GitLab ofrece soporte para SHA-256 desde hace un año, mientras que GitHub anunció una versión beta privada en Git Merge, con disponibilidad general prevista para dentro de unos meses.
Uno de los principales problemas al fusionar ramas (merge) ha sido la gestión de archivos en conflicto cuando el directorio de trabajo contiene otras ediciones sin terminar. Hasta ahora, el comando git add –update se utilizaba frecuentemente para añadir los archivos resueltos al índice, pero este comando también añade todos los demás archivos modificados previamente rastreados en el directorio, lo que puede provocar que código a medio terminar se incluya en el commit de fusión por error.
Git 2.56 soluciona esto introduciendo el modo git add –resolved. Este nuevo comando opera exclusivamente sobre los archivos que se encuentran en estado de conflicto e ignora por completo cualquier otro archivo modificado en el directorio de trabajo que no esté relacionado con la fusión. Además, escanea el código en busca de marcadores de conflicto (como <<<<<<<); si detecta alguno, devuelve un error, bloquea la indexación de los archivos y muestra una lista de los elementos que aún requieren atención manual.
Operaciones en repositorios de escala empresarial (como los de Chromium o el kernel de Linux) han recibido un aumento masivo de rendimiento. El algoritmo responsable de buscar los commits comunes más recientes (necesario al fusionar ramas o comparar historiales) ha sido reestructurado y ahora es capaz de analizar commits que pertenecen de manera exclusiva a una rama, lo que le permite detener el escaneo inmediatamente después de identificar todos los ancestros comunes posibles, evitando recorrer la totalidad del historial de cambios de forma innecesaria.
En las pruebas de rendimiento, la velocidad de búsqueda aumentó 20 veces en promedio, alcanzando hasta 70 veces más velocidad en algunos repositorios. Al ejecutar git merge-base –all v4.8 v4.9 en el repositorio del kernel de Linux, los pasos de recorrido cayeron drásticamente de 167 000 a solo 3800. Las operaciones en la tabla de referencias que involucran grandes acumulaciones de registros de eliminación ahora se ejecutan 65 veces más rápido (reduciendo el tiempo de 13 segundos a apenas 0,2 segundos). La ejecución de git diff en el repositorio de Chromium (con 500 000 elementos en el índice) redujo su tiempo de ejecución de 8 minutos a tan solo 0,07 segundos.
Optimización de almacenamiento y archivos de paquete
Para optimizar el almacenamiento en servidores, el modo de reempaquetado –path-walk ha sido adaptado. Esta función agrupa los objetos de Git según su ruta específica en el árbol de directorios, logrando empaquetados mucho más eficientes. Como resultado directo, el tamaño del archivo de paquete del repositorio Fluent UI se redujo de 558 MB a 164 MB. Asimismo, la nueva versión permite combinar –path-walk con mapas de bits de accesibilidad e islas delta (tecnologías utilizadas por plataformas de alojamiento Git para acelerar el servicio y aislar las bifurcaciones).
Como parte de un proyecto de Google Summer of Code, se añadió la capacidad de descargar y gestionar archivos grandes de forma inteligente en clones parciales (clones que no descargan todos los objetos inicialmente). El nuevo comando git repack -a –filter=blob:limit=1m –drop-filtered permite a los usuarios buscar blobs (archivos grandes) descargados bajo demanda que ya no se necesitan en el índice actual y eliminarlos del disco local para recuperar espacio.
De manera complementaria, el comando git cat-file –batch-command ahora puede consultar los metadatos y el tamaño de un objeto remoto sin necesidad de descargar el archivo completo, ahorrando ancho de banda.
La versión 2.56 expande la utilidad de múltiples comandos de manipulación del historial y referencias de Git:
- git history drop: Este nuevo subcomando permite eliminar un commit existente en una sola línea y reescribir automáticamente el historial adjuntando sus descendientes al commit principal anterior, reemplazando la necesidad de usar git rebase -i y un editor interactivo.
- git branch –delete-merged: Permite eliminar de forma segura grupos de ramas locales cuyos cambios ya hayan sido integrados en un repositorio externo (ej. origin/main), solucionando el problema de las ramas originadas desde una rama base local que luego se integran directamente en el servidor.
- git refs create|update|delete|rename: Centraliza y combina las operaciones de bajo nivel para manipular directamente las referencias, incluyendo la posibilidad de exigir la validación de un valor anterior esperado antes de aplicar una actualización o eliminación.
- git replay –linearize: Introduce una topología de fusión plana y lineal al realizar rebases del lado del servidor sin acceder al árbol de trabajo, descartando y resolviendo el problema de las ramas que contienen commits de fusión (merge commits) que antes bloqueaban el comando.
- git log –follow: Ahora es capaz de registrar de forma coherente los cambios de nombre de archivos incluso en historiales de confirmación no lineales (como subramas fusionadas). Sugerencias tipográficas: El sistema detecta errores de sintaxis comunes y sugiere el uso correcto, por ejemplo, detectando git push origin/main y sugiriendo git push origin main.
Finalmente, si estas interesado en poder conocer mas al respecto, puedes consultar los detalles en el siguiente enlace.
