Заканчивался последний день рабочей недели…
Заканчивался последний день рабочей недели. Я делал себе кофе на офисной кухне, размышляя, каким образом мы бы смогли снизить очередь пул реквестов, которая сильно разрослась после введения review guide. Вроде бы простые правила вызывали длительную переписку в комментариях к пул реквестам между членами review team и разработчиками фрэймворка.
Ничего не предвещало. Смеркалось.
Внезапно рабочий чат зашелестел сообщениями:
– Почему мой пулл реквест удалили?
– И мои пулл реквесты грохнули!
– И мой!
Спустя буквально несколько минут инвестигаций мы выяснили, что это случилось, потому что кто-то удалил рабочую ветку Bootstrap, куда более чем 40 человек контрибьютили более чем три месяца. Ещё раз, чтобы можно было осознать всю величину проблемы – сорок человек вливали туда код на протяжении более чем три месяца.
Коллеги тут же стали фонтанировать идеями о том, что мы все имеем локальные копии этой ветки, и давайте создадим эту ветку с нуля.
По своиму опыту я знаю, что поспешные решения и импровизация не приводят ни к чему хорошему, поэтому я попросил всех не предпринимать никаких дейтсвия и буквально «убрать руки с клавиатуры».
Итак, диспозиция – пятница, вечер, уже почти пустой офис, потерянная ветка с огромной кодовой базой. Если не решить эту проблему здесь и сейчас, то есть вероятность, что ситуация станет хуже, если на выходных к работе подключатся другие разработчики, которые не в курсе текущей ситуации (мы же все аккуратно читаем рабочий чат, не так ли?).
Я вежливо спросил в чате, кто удалил ветку Bootstrap, и один молодой разработчик, которого включили в работу совсем недавно, признался, что это сделал он по ошибке. «Простите».
Я хватаю удачно подвернувшегося под руку RomanYIovlev, и мы мчимся к молодому разработчику, который в этот момент переживает экзистенциальный кризис, и чьё рабочее место, по счастливой случайности, находится в том же офисе, что и мы.
Ветку мы, конечно, восстановили – немного git магии, и всё получилось. Чего не скажешь о более чем 20 пулл реквестах, которые так и сгинули в недрах GitHub`а. Неприятно, но не смертельно.
Время перевести дух, разобраться в произошедшем и сделать некоторые выводы.
Главный вопрос – зачем? Ответ, в общем-то, тривиальный – случайно. Что-то было не так с кодом, который был закомитан в собственную рабочую ветку – ничего криминального, просто некрасиво код был написан, а если даже ревертишь коммит, то он все равно остается в истории. Поэтому разработчик решил снести всю свою рабочую ветку и создать заново. С чистого листа. И под горячую руку попалась ветка Bootstrap. Пятница. Вечер. Миссклик, да.
GitHub позволяет отменить операцию удаления, но только до момента, пока страница не обновлена, и этот шанс использован не был.
Можно ли было избежать этой ситуации? Да, можно. По умолчанию, любой, кто имеет write доступ до вашего репозитория, может удалить любую ветку. Однако GitHub позволяет создать Branch protection rule для одной или более веток.
Где важно убедиться, что соответствующий чек бокс не прочекан.
Для ветки bootstrap это сделано не было, и это нас догнало.
В сухом остатке:
1. Ветку спасли.
2. Теперь на любую ветку, в которую контрибьютит более чем один человек, мы устанавливаем Protection rule. Что я рекомендую, не забывать делать всем.
3. Поддержку пакета BootStrap в JDI Light мы в итоге реализовали и зарелизили. Но что это и зачем – это уже другая история…