структурное слияние в git
как работающий в команде программист, я неизбежно сталкиваюсь с необходимостью производить слияние разных изменений в одном файле: «мёржить код». К счастью, чаще всего автоматическое слияние справляется без моего участия, и разрешать конфликтующие изменения мне доводится редко. Да и это дело обычно сводится к перестановке строчек и нескольких знаков препинания. Однако статья «Cемантическое слияние JSON файлов в Git» меня сильно впечатлила: в ней было целых две новых идеи за раз. Одна, умеренно интересная — что процесс слияния в гите можно настраивать. А вот вторая была помасштабнее. Я ведь раньше не задумывался, что проводящий слияние процесс может быть умным и понимать структуру изменяемых файлов, вместо того, чтобы тупо смотреть на номера строчек. В статье, конечно, сказано только про JSON, но так ведь можно пойти дальше! Как насчёт умного мёржера для Javascript?
в общем, я направился на поиски готовых умных инструментов, которые можно подключить к моему гиту. И тут передо мной раскрылась зияющая пропасть. Если коротко, то эту задачу можно формализовать как поиск различий между двумя AST-деревьями, и математики показали, что её сложность O(n*n). Очень сложно. А сам процесс обычно называют семантическим или структурным слиянием. Некоторые инструменты пробуют это делать, но и стоят довольно прилично, чтобы компенсировать сложность реализации. Хотя вроде что-то такое есть и в Eclipse, но я это ещё не пробовал.
Посмотрел я на это, и понял, что моя проблема слишком редка и мала, чтобы отдавать за неё такие деньги, и слишком сложна, чтобы пытаться решить самостоятельно. Но вот вам ссылки на существующие решения: