climber
00:09 25-05-2023
На потом. Будет время, попробовать воспроизвести.

Контекст: репозиторий в git. Ветка master хранит то, что установлено на прод. Есть ветки, условно, UAT и TEST - там то, что стоит на тестовой среде для юзеров и для тестеров. И есть девелоперские ветки, где девелоперы девелопят. Когда готово (или девелопер думает, что готово), ветка мерджится в TEST или UAT ветку.
История болезни: юзеры открывают баг. Девелопер 1 создает ветку dev1, что-то кодит. Потом merge в TEST. Потом работу передают второму. Он создает ветку dev2 и что-то кодит (плюс-минус то же самое), потом - merge в TEST. Естественно, с конфликтом и ручным исправлением. Потом работу передают третьему. Третий - дятел с большой буквы Д. И он уже кодит то в одной ветке, то в другой по очереди (причем сам похоже не понимает этого), потом идут merge и в TEST, и в UAT. С конфликтами и ручным разрешением конфликтов. Потом мне это надоело, я его заставил одну ветку убить, а все изменения перенести в другую. Милостиво позволили самому выбрать, какую ветку убить, а какую оставить.
Долго ли, коротко ли, но через какое-то время обнаружилось, что на всех средах код разный.
Начинаю смотреть список комитов, которые меняли файл (он там один менялся). Все хэши комитов одинаковые на UAT и на TEST. В dev1 ветке - те же комиты, но отсутствуют (логично) те комиты, которые были из убитой dev2 ветки (они есть в TEST и UAT). Пытаюсь делать git revert комитов из dev2. Опять лезут конфликты, но как бы я их не разрешал, TEST и UAT ветки все равно разные, и с dev1 веткой все равно не совпадают.

Мы сломали git!