#git #azure-devops #merge-conflict-resolution
Вопрос:
Вот рабочий процесс, который используют наши команды:
main
ветвь, в которую ветви функций объединены; это обрабатывается командой Abig-feature
ветвь, которая используется командой B, которая была разветвлена отmain
- команда B будет иметь меньшие функциональные ветви от
big-feature
; они используют регулярные ускоренные слияния, когда они втягивают свои функциональные ветви вbig-feature
Проблема: время от времени команда B хочет получать последние изменения от main
своих big-feature
. Поэтому они делают следующее:
- извлеките все изменения из источника и перенесите все изменения в их локальную
main
- создайте
merge-with-main
ветвь изbig-feature
- слиться
main
вmerge-with-main
Теперь я ожидаю, что они должны получать конфликты только в файлах, в которые они внесли изменения, которые также были изменены main
. Однако в настоящее время они получают более 250 конфликтов слияния, и большинство (если не все) из них находятся в файлах, которые они вообще не изменили. Глядя на конфликты в Visual Studio, становится ясно, что «их» файл-это, например, некоторая начальная версия файла с множеством NotImplementedException
случаев, когда файл-заглушка был зафиксирован в main
ветке, а «входящий» — это тот же файл с некоторой реализацией. Снова — тот же файл, явно не измененный командой B, но помеченный как конфликтный.
В настоящее время команда B вручную разрешает эти конфликты (обычно используя опцию «взять их»), но с более чем 250 файлами это действительно хлопотно. Что здесь происходит, и почему происходят эти конфликты, и что можно сделать, чтобы предотвратить / легко разрешить их?
Редактировать: я верю сквош-слияния используются на main
может быть виновником, но насколько мне известно они должны только быть проблемой, если big-feature
получает некоторые изменения из ветви компонента из группы — то git будет действительно «потерять» след ее, так как, когда команда совершает тогда источник филиала является, по сути, нет. НО команда B получает материал только напрямую main
(помимо их собственных изменений, когда они, конечно, работают над своей собственной функцией), и у изменений в main
должен быть источник, нет?
Опять же, слияния в сквош используются только тогда , когда команда А привлекает небольшую feature-branch
main
команду, и это делается системой PR Azure DevOps.
Комментарии:
1. Сквош-слияния кажутся здесь ключом к разгадке: было ли что-то в предыдущей истории
big-feature
с не раздавленной версией некоторых из этих изменений, так что результат выглядит так же , какmain
, но история не такова?2. @Pogrindis «Для начала это следует регулярно обновлять // объединять с main». Регулярные слияния с main — это именно то, что описано в вопросе как причина проблемы.
3. Слияние @IMSoP не является
squash-merge
4. @Pogrindis В описании того, что они делают, просто говорится «объединить основное в слияние с основным». Слияния сквоша упоминаются только в отношении объединения других функций в основную. Возможно , они используют слияние сквоша в ветке «слияние с основным», и в этом случае это объяснило бы проблему, но на самом деле они этого не говорят.
5. @IMSoP ах, я думал о первом пункте, где, по — видимому, обнаруживаются конфликты-в этом случае будет ли fast-fwd, который команда A, вызывать некоторое несоответствие фиксации ?
Ответ №1:
Если вы сквош-слияние, то ветвь не будет объединена, но вместо ветви будет создана новая фиксация. Если впоследствии вы снова объедините ветвь, Git не сможет вычислить базу слияния и попытается снова объединить (некоторые из) изменений, что приведет к конфликтам.
Если вам нужно периодически объединять ветвь в другую ветвь, используйте не сквош-слияние, а обычное слияние. Если вы используете сквош-слияние, вам придется перебазировать все дочерние ветви в новую сквош-фиксацию.
OPs EDIT:
Оказалось, что команда B на самом деле не использовала регулярные слияния при обновлении своей bit-feature
ветви с помощью кода из main
и использовала сквош-слияния. Таким образом, они нарушили последний абзац этого ответа, вызвав всевозможные проблемы в дальнейшем.
Комментарии:
1. Согласитесь на регулярное слияние или перебазирование, если вам нужно сохранить все коммиты с
main
2. Просто для ясности, в настоящее время в вопросе упоминается только слияние сквоша для других задач, входящих в основную. Шаг «объединить основное в слияние с основным» (а затем объединить его в большую функцию) на самом деле не указывает, какие параметры они используют. Но если они используют слияние сквоша для любого из них, вы правы, что это вызовет описанную проблему.
3. Похоже, это не то, что здесь происходит. Команда B не объединяет отдельные ветви функций из команды A в свою
big-feature
ветвь, а, скорее, они берут всюmain
ветвь. Так что… слияния сквоша НЕ ДОЛЖНЫ иметь эффекта, АФАИК.4. @Shaamaan Согласно вашему собственному ответу, который был опубликован полчаса спустя, это именно то, что здесь происходит 🙂
5. @knittl Да — я не знаю почему, но я думал, что речь идет об отмене
main
, которая сама по себе не является проблемой. Я приму это.