Бывают конфликты слияния, которых git не показывает
Текст сливается чисто, а смысл расходится. Три случая за день:
- Рантаймы Java, C# и Rust перестали собираться вообще. Помощники были написаны под прежний вид списка (
expectListотдавала массив), а объявление списка суммой сделало список значением. 106 красных, и ни одного намёка при слиянии. - Дублирующееся имя функции.
«Найти замену»объявлена и вself/defunc.flang, и вself/proof-initial.flang— корпус не грузился вовсе. - Пример перестал проверять то, ради чего написан — см. checks-that-stopped-comparing.
Правило, выведенное из этого. После каждого слияния цели — собирать её рантайм, а не только гонять тесты печати. Тест печати сравнивает текст и остаётся зелёным, когда собранный код уже мёртв.
Второе правило. После слияния перемерять всё, что является измерением, а не памятью: списки охвата, числа в прозе, ведомость. Они устаревают молча.
Сборка work/svodka3 прибавила ещё четыре случая, и все четыре — того же рода
- Модуль перестал загружаться от одной стрелки.
types.mjsимпортировалADDRESSED_ACTIONS, которого в новомconc.mjsбольше нет — его место занялACTION_PROCESS_FIELD. Текст слился чисто,SyntaxErrorпри первом импорте. - Два цикла-генератора слились в один. У первого пропала закрывающая скобка, второй начался внутри него:
flang/src/proof.mjsне грузился вовсе. Такое же место нашлось второй раз в том же файле через две ветки. - Мёртвая строка перед проверкой. В
объединить(types.mjs) осталосьreturnДО согласования масштабов — правило «умножение масштабы складывает» перестало краснеть, оставшись в файле целиком. - Эталон отстал от свидетеля. Ветка сверялась со свидетелем, каким он был на её базе; в дереве свидетель вырос. Сверка эталона дала 10 красных из 26, и ни один не был виден до прогона. Это повторилось ЧЕТЫРЕЖДЫ — с правилом умножения, с типом
вес, со вторым случаем умножения и с фактами о встроенных формах, — и ещё дважды у эталона РАЗБОРА: словосвойствопришло в побайтовый корпус с одной ветки, а продукции к нему не было ни на одной, и восьмое действиепородитьразошлось со свидетелем на 1109-м байте одного файла.
Третье правило, выведенное из седьмого случая. Эталон, слитый с ветки, обязан быть прогнан СРАЗУ — до следующего слияния. Его сверка называет число сравненного, и падение читается однозначно: «свидетель уехал, догоняй». Прогнав после трёх слияний, чинишь три расхождения разом, не зная, какое чьё.
Четвёртое правило, и оно про корпус. Ветка, добавляющая программу в каталог побайтовой неподвижной точки, обязана прогнать эталон разбора В ТОЙ ЖЕ работе. Слово, которого эталон не знает, ломает сверку не у автора, а у сборщика — и ломает её через сутки, когда причину искать уже негде.
Связано: checks-that-stopped-comparing, a-removal-must-turn-a-test-red