Самый долгий merge в моей жизни ★

Заметка будет интересна только программистам.

Фотография ниже лежит у меня на ноуте с августа 2013 года. Очень не люблю такое — всё нужное я привык закачивать в интернет, всё ненужное — удалять. Не мог определиться куда деть это фото, решил положить в блог, снабдив небольшим рассказом.

На стене вывешены десятки листов с текстом, справа висит записка с надписью «НЕ ТРОГАТЬ!
Каждый файл для слияния приходилось печатать на куче бумаги, раскладывать на полу и сравнивать вручную

Наверное все программисты знают что такое «мерж» (merge) — слияние двух веток и согласование изменений, сделанных в файлах в рамках этих веток. Если системе контроля версий удаётся справить самостоятельно, то «мержи» происходят автоматически, это, в моей практике, наиболее частая ситуация. В противном случае возникает «конфликт» — «мерж» останавливается до разрешения конфликта человеком. Только человек может решить как будет выглядеть сводный код, учитывающий изменения, сделанные в двух слияемых ветках.

Я однажды попал в неприятнейшую ситуацию, когда две команды в нашей компании, в силу многих причин, независимо работали над одним и тем же продуктом около года.

Одна из команд работала над функциями, которые нужны в продукте заказчику, вторая, которой руководил я, — делала несколько довольно серьёзных изменений с заделом на будущее, в частности — внедряла шаблонизацию.

Через год попытались слить две ветки воедино и получили конфликты почти во всех основных файлах проекта. Ничего совсем уж неожиданного, конечно, особенно с учётом того, что часть кода была переписана с ПХП на «Твиг», но никогда в ещё в жизни я не видел столько конфликтов. Затронуты были, если мне не изменяет память, несколько сотен файлов.

С одной стороны, других вариантов, кроме как собрать это всё воедино, не рассматривалось, с другой стороны, объём предстоящей работы удручал.

В общем, погрустил я, погрустил, повесил табличку «Не беспокоить» и заперся в кабинете на неделю. Каждый файл с конфликтом распечатывал дважды — из каждой ветки. Потом раскладывал распечатанное на полу, выделял маркером одинаковые места, рисовал стрелками что куда переместилось, шёл к ноутбуку и так или иначе разрешал конфликт.

На фотографии — процесс разрешения конфликтов одного из файлов. Через неделю я был полностью разбит монотонностью работы, но ветки слил.

Комментарии 14

Alexander № 1
У нас не настолько большой был мёрж, но нескольких сразу модулей и эта работа так вымотала разработчика, что он был готов уволиться, если ему немедленно не дадут нормальное задание. Так что отдаю должное вашему терпению.
PastorGL № 3
У меня подобных историй было две.

Первая — пришлось сделать частичный бэкпорт («реинтегрировать» ветку как оно называется в терминах SVN), половину изменений при этом откатить, и подменить транк пропатченной более ранней версией. Это, блин, в проекте из ~50 модулей, над которым одновременно работало 6 команд в трёх временных зонах. Почти год потом был этаким «хранителем репозитория» и занимался надзором за всеми последующими мержами, пока снова не нагнали прежнее состояние :\ Чуть не погиб каждый день читать всю историю коммитов в тонне кода.

Вторая — локализация проекта на полтора миллиона строк кода, выпекаемая аж 9 месяцев отдельной командой в отдельном бранче. Под конец каждый день приходилось мержить из апстрима, и разгребать конфликты в .po для 11 языков. Конечный мерж в транк так или иначе затронул ~200 тыщ строк, но ничего не уронил.

В общем, ну его в жопу такие задачи, больше за подобное в жизни не возьмусь.
Евгений Степанищев автор № 4
А потом ещё несколько недель чинили последствия мержа? :)

Сколько-то чинили, но каких-то заметных последствий именно от мержа я не припомню, другие баги — были, конечно.

Василий Топоров № 6
Есть какая-то горькая ирония в том, что в компании с подзаголовком «Система электронного документооборота» конфликт решается на бумаге.
Евгений Степанищев автор № 7
Это не подзаголовок, компания так и называется — «Системы документооборота». Только разрешение конфликтов кода и документооборот — это бесконечно далёкие вещи. В чём ирония?
Имярекъ № 8
Горизонт чутка завален.

Пришлось поставить расширение для поворота картинок.
Странно, что браузеры из коробки такое до сих пор не предлагают.
Николай Лебеденко № 10
1. Надо автоматически мониторить ветки, которые давно не подтягивали master
2. Можно было поступить проще — полностью взять код из 1-ой ветки, а потом снова просто имплементировать все написанное из 2-ой ветки (скорее всего понадобилось бы изменить несколько мест, которые конфликтовали бы + добавить какое-то кол-во новых строк), в итоге ушло бы 1-2 дня максимум, я обычно так решаю все конфликты, это очень экономит время.
Евгений Степанищев автор № 11
1) это решение не подходило в данном случае из-за своеобразных проблем, о которых я не хочу распространяться
2) увы, вы слишком оптимистичны
Кот котофей № 12
Сейчас 26 год) я совсем не программист и даже термин мерж мне был не знаком) сейчас я пишу код через ИИ использую Клод антигравити и чат джипити, сделал хороший сайт пару аппок и дилерский он лайн каталог)
Мой друг тоже не программист совсем, доделывает проект который уже стоит больше 100к все тоже на ИИ)