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

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

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

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

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

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

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

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

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

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

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

Поделиться
Отправить
Запинить
11 комментариев
Alexander

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

hshhhhh.name

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

PastorGL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Имярекъ

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

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

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

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

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

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

Популярное