Найти в Дзене
Цифровая Переплавка

🦒 Mergiraf — когда Git наконец начинает «понимать» код

Если честно, я давно ждал момента, когда кто-то возьмёт и сделает для Git нормальный умный merge. Не тот, что сравнивает строки, а тот, который понимает, что код — это не набор символов, а структура. И вот он появился: Mergiraf, merge-драйвер, который работает на уровне синтаксического дерева. И да, он написан на Rust — куда же сегодня без Rust. Что делает Mergiraf интересным? То, что это не очередная академическая попытка переписать Git-merge, а рабочий инструмент, который реально экономит время: из 7 415 конфликтов в истории ядра Linux он автоматически решил 428. И это без магии ИИ — чистый алгоритм и AST. Kлассический Git merge использует стратегию ort, работающую по принципу: 🔹 Каждая строка — атомарная единица изменения.
🔹 Если изменения попали в одну строку — конфликт.
🔹 Что внутри строки — Git не волнует. Проблема: строка в коде ≠ логическая конструкция. Это просто место, куда разработчик нажал Enter. Пример из новости: Git думает: «Это конфликт, товарищи».
Mergiraf думает: «
Оглавление

Если честно, я давно ждал момента, когда кто-то возьмёт и сделает для Git нормальный умный merge. Не тот, что сравнивает строки, а тот, который понимает, что код — это не набор символов, а структура. И вот он появился: Mergiraf, merge-драйвер, который работает на уровне синтаксического дерева. И да, он написан на Rust — куда же сегодня без Rust.

Что делает Mergiraf интересным? То, что это не очередная академическая попытка переписать Git-merge, а рабочий инструмент, который реально экономит время: из 7 415 конфликтов в истории ядра Linux он автоматически решил 428. И это без магии ИИ — чистый алгоритм и AST.

🧠 Почему line-based merge — это прошлый век

Kлассический Git merge использует стратегию ort, работающую по принципу:

🔹 Каждая строка — атомарная единица изменения.
🔹 Если изменения попали в одну строку — конфликт.
🔹 Что внутри строки — Git не волнует.

Проблема: строка в коде ≠ логическая конструкция. Это просто место, куда разработчик нажал Enter.

Пример из новости:

  • Один разработчик меняет возвращаемый тип void → int.
  • Второй меняет тип аргумента int → long.

Git думает: «Это конфликт, товарищи».
Mergiraf думает: «Это две независимые операции в AST».

И генерирует:

int callback(long status);

То есть делает то, что бы сделал любой здравый человек.

🌳 Как Mergiraf понимает код

Основные опоры инструмента:

🧩 tree-sitter

— превращает код на 33 языках в универсальное синтаксическое дерево.
— токены → узлы → грамматика языка.

🧬 Алгоритм GumTree

— «размазывает» отличия между деревьями, определяет что куда переехало.

🗂️ Факты о дереве

Mergiraf превращает AST в список утверждений вроде:

🪵 «У узла X есть дети A, B, C»
🧱 «Эта ветка была изменена в левой версии»
🧱 «Эта — в правой версии»

А затем собирает новое дерево, отбрасывая противоречащие факты.

Получается своего рода CRDT для синтаксических деревьев.

🔄 Коммутативные родители — фича, за которую я готов аплодировать

💡 В Rust порядок полей структуры не важен (если нет #[repr(C)]).

Пример:

🟦 Ветка A добавляет new_field_left
🟥
Ветка B добавляет new_field_right

Git: «АГА! КОНФЛИКТ!»
Mergiraf: «Да хоть переверните эти поля, Rustу всё равно».

Это называется commutative parent — синтаксический узел, где порядок детей не важен.

В C так нельзя — порядок полей меняет ABI.
Mergiraf это
знает.

А значит, это первый merge-драйвер, который учитывает специфику языка.

🚀 Что меня особенно впечатлило

Вот мои личные инсайты:

🦾 🧩 Точная работа с конфликтами

Mergiraf не пытается быть умнее разработчика, но умеет:

🧠 разделять правки, даже если они попали на одну строку,
🧹
избегать ложных конфликтов,
🪶
не трогать то, с чем Git справился сам.

То есть это не «магия merge», а аккуратная инженерия.

⚙️ Экономия времени в больших монорепах

Да, 428 конфликтов из 7415 — это всего 5,7%,
но в больших проектах
каждый ручной конфликт — потеря контекста, внимания и ментальной энергии.

Если ваш проект — как Linux kernel или Chromium, это критическое улучшение.

🛠️ Реальная интеграция с Git

В .gitattributes можно прописать:

[merge "mergiraf"]
name = mergiraf
driver = mergiraf merge --git %O %A %B -s %S -x %X -y %Y -p %P -l %L

Работает с:

🔧 git merge
📦 git stash apply
↩️ git revert

А ещё есть команда mergiraf review, позволяющая проверить решения инструмента.

🔍 Честная философия: “мы не скрываем, что сделали”

Если Mergiraf что-то решил сам, он пишет:

INFO Mergiraf: Solved 2 conflicts. Review with: mergiraf review …

Это идеальный баланс: автоматизация без потери контроля.

🧨 Чего стоит бояться (и почему это не страшно)

Некоторые опасения из обсуждений вполне разумны:

⚠️ Возможны логические конфликты, которые не поймает AST.
⚠️ Переименование, поведение макросов, derive-атрибуты, unsafe-код — всегда зона риска.
⚠️ Полагаться слепо нельзя, тесты должны быть.

Но важно понимать:

🔸 Mergiraf не пытается «угадывать намерения».
🔸 Он не объединяет по смыслу — только по структуре.
🔸 Он всегда оставляет конфликт, если есть
малейшее сомнение.

Это не ИИ, не «сверхумный Git».
Это точечный инструмент, который
убирает тупую рутину, оставляя человеку только реальные конфликты.

🌌 Куда это всё приведёт

На мой взгляд, Mergiraf — это не просто merge-драйвер.

Это шаг в будущее, где инструменты CI/CD будут:

🧬 анализировать AST,
🧠 понимать семантику,
🕊️ минимизировать конфликты,
🧪 автоматически тестировать потенциальные несостыковки,
🧺 помогать ревьюеру подсвечивать подозрительные места.

И самое забавное: всё это делается без нейросетей, чистой алгоритмической инженерией.

В мире, который зациклен на LLM, такие проекты напоминают, что «классические» алгоритмы всё ещё могут творить чудеса.

🔗 Источники

🦒 Оригинальная статья LWN:
https://lwn.net/SubscriberLink/1042355/434ad706cc594276/

🦒 Репозиторий проекта:
https://github.com/mergiraf/mergiraf