Пишу, по большей части, про историю, свою жизнь и немного про программирование.

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

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

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

Каждый файл для слияния приходилось печатать на куче бумаги, раскладывать на полу и сравнивать вручную

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

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

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

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

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

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

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

Ctrl →Apple I
11 комментариев
Alexander 2018

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

hshhhhh.name 2018

Эпично.
А потом ещё несколько недель чинили последствия мержа? :)

PastorGL 2018

У меня подобных историй было две.

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

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

В общем, ну его в жопу такие задачи, больше за подобное в жизни не возьмусь.

Евгений Степанищев 2018

А потом ещё несколько недель чинили последствия мержа? :)

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

Евгений Степанищев 2018

У меня подобных историй было две.

Даа, сочувствую :(

Василий Топоров 2018

Есть какая-то горькая ирония в том, что в компании с подзаголовком «Система электронного документооборота» конфликт решается на бумаге.

Евгений Степанищев 2018

Это не подзаголовок, компания так и называется — «Системы документооборота». Только разрешение конфликтов кода и документооборот — это бесконечно далёкие вещи. В чём ирония?

Имярекъ 2018

Горизонт чутка завален.

Пришлось поставить расширение для поворота картинок.
Странно, что браузеры из коробки такое до сих пор не предлагают.

Евгений Степанищев 2018

Да что там особо рассматривать-то? Это уж так, КДПВ.

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

1) это решение не подходило в данном случае из-за своеобразных проблем, о которых я не хочу распространяться
2) увы, вы слишком оптимистичны