Mergiraf: un driver de merge de Git que entiende la sintaxis del código
El proyecto, escrito en Rust y con licencia GPLv3, resuelve conflictos por estructura sintáctica en lugar de por líneas. Su último commit mejora el aviso cuando el merge se rinde y cae a Git.
Git resuelve los conflictos por líneas. Si dos personas tocan el mismo archivo en zonas distintas que caen cerca, aparecen los marcadores de conflicto aunque el código no se pise de verdad. Mergiraf ataca justo eso: es un driver de merge que parsea el archivo y mezcla por estructura sintáctica, no por líneas.
El proyecto está alojado en Codeberg, se publica bajo GPLv3 y su primera versión data de noviembre de 2024. El grueso del código es Rust: el repositorio se reparte en un 69% de Rust, un 20,3% de Java (buena parte, material de pruebas), un 3,6% de Python y una cola con MATLAB y Scheme. Cubre una colección de lenguajes y formatos que va creciendo, y el soporte de MATLAB entró a mediados de agosto.
Qué ha cambiado en el último commit
El cambio más reciente es pequeño pero se nota en el día a día. Cuando el merge estructurado tarda demasiado, Mergiraf se rinde y delega en Git. Hasta ahora el aviso no decía sobre qué archivo había pasado eso. Ahora sí:
WARN structured merge of src/app/models.py took too long, falling back to Git
El mensaje incluye la ruta del fichero que cayó al fallback, tomada del parámetro -p o, si no, de la ruta base. En la descripción del commit se explica que es la versión mínima de lo pedido en el issue #466 y que la línea de progreso previa al timeout se ha dejado fuera por ahora, porque en la práctica repetiría el mismo aviso unos segundos antes.
Cómo lo operas
Se integra como cualquier otro merge driver de Git: se declara en la configuración y se activa por atributos de archivo, así que no cambia el flujo de trabajo de quien hace el merge, solo lo que pasa por debajo cuando hay ramas divergentes sobre el mismo fichero. El caso donde más se nota es el de archivos largos con cambios dispersos, típico en refactors y en ramas que viven semanas separadas.
El motivo del fallback por tiempo es razonable: parsear el árbol sintáctico cuesta más que comparar líneas, y en un archivo enorme el driver prefiere devolver el control a Git antes que bloquear la operación. Que ahora diga qué archivo provocó la caída convierte un aviso genérico en algo accionable: si ves siempre el mismo nombre en el log, sabes dónde mirar.
El proyecto mantiene la documentación en su web y un chat público en Zulip para dudas y contribuciones, con la instancia financiada por el propio Zulip. La incógnita es la de siempre en este tipo de herramientas: cuántos lenguajes y formatos llegan a cubrirse con la calidad suficiente para que el merge estructurado sustituya al de Git sin sorpresas.
