Git & ApartCI — как проверить конфликты кода, прежде чем вызвать функциональную поломку?

Следующая разработка на основе магистральных каналов, показанная ниже:

введите здесь описание изображения


Предположим, что из master(ствола) созданы две краткосрочные ветви функций (f1 и f2). Для реализации файлы исходного кода, используемые для этих ветвей, в этом сценарии перекрываются.

Предположим, что существует один конвейер CI/CD для master(магистраль), который срабатывает при изменении кода.


Один из возможных конфликтов кода является функциональным, f1 может удалить или изменить существующий исходный код, который использует f2.... Это не конфликт VCS.

Разработчик1 выполнил git commit на f1 (на ноутбуке) в t время и еще не push

Разработчик2 выполнил git commit на f2 (на ноутбуке) в t+24 время и еще не push


Насколько я понимаю, ниже приведен сценарий в файле истории фиксации ноутбука перед отправкой:

введите здесь описание изображения В приведенном выше сценарии f1 можно объединить с master, что представляет собой простое ускоренное слияние. Таким образом, master и f1 будут указывать на моментальный снимок фиксации 156b4bf после этого слияния, как показано ниже:

введите описание изображения здесь Конвейер CI/CD запускается, так как слияние прошло успешно, без конфликтов

Но когда через 24 часа произойдет f2 фиксация, Git выполнит 3-стороннее слияние с использованием 3 снимков (156b4bf, 96f5b29 и c435356), как показано ниже:

введите описание изображения здесь Конвейер CI/CD снова запускается, если слияние прошло успешно. Насколько я понимаю, Git должен блокировать трехстороннее слияние из-за функционального конфликта.


1) Используя Git, выявляет ли ускоренная перемотка вперед / трехстороннее слияние функциональный конфликт?

2) Если да, существуют ли какие-либо другие сценарии конфликтов, не связанные с VCS, которые рассматриваются ApartCI? что Git не может... если да, то как?

Примечание. Использование рабочего процесса Gitflow не планируется< /эм>


person overexchange    schedule 19.01.2019    source источник
comment
@DanCornilescu Во-первых ... Для сценария, указанного в запросе ... обнаруживает ли трехстороннее слияние конфликт без VCS?   -  person overexchange    schedule 20.01.2019


Ответы (1)


Чисто функциональный конфликт — это конфликт, в котором 2 конфликтующих изменения не касаются одних и тех же файлов:

  • f1 изменяет прототип функции (скажем, в файле S1) и все его использования (скажем, в файлах S2 и S3)
  • f2 добавляет использование новой функции в другой файл, в котором эта функция ранее не использовалась (скажем, в файле S4), используя исходный прототип, так как он еще не видел изменения f1

Каждое изменение по отдельности может пройти проверку, но при объединении в одной ветке код не будет работать, так как вызов, добавленный в S4, не будет соответствовать обновленному прототипу из S1. сильный>.

В таком случае оба слияния выполняются с ускоренной перемоткой вперед, и git не может обнаружить конфликт - при трехстороннем слиянии не будет фактического слияния файлов, поскольку наборы изменений не касаются одних и тех же файлов. Таким образом, конфликт не будет обнаружен инструментами на основе git, анализирующими слияние, например, gerrit.

Только проверки, выполняемые инструментом CI/CD, могут обнаружить такой чисто функциональный конфликт путем обнаружения несоответствия. В зависимости от используемого языка это будет либо ошибка сборки/компиляции, либо ошибка теста/времени выполнения/выполнения.

Если 2 изменения вызывают конфликт слияния (трехсторонний или нет), это означает, что конфликт является конфликтом VCS, а не чисто функциональным, и да, он будет обнаружен с помощью git и/или инструментов на основе git, поэтому ему потребуется необходимо решить до того, как слияние будет разрешено (исполнение инструмента CI/CD не будет необходимым для его обнаружения)

На ваш второй вопрос ApartCI обнаружит конфликт любого типа:

  • если это конфликт VCS, 2 изменения перекрываются (т. е. они оба касаются как минимум одного общего исходного файла), поэтому они не будут объединены вместе для одновременной проверки. Это означает, что они никогда не попадут в основной пакет. Один из них будет зафиксирован и первым попадет в базовый план проекта. Как только это произойдет, другое изменение не будет исправлено при следующей попытке проверки и будет отклонено.
  • if it's a purely functional conflict the 2 changes are not overlapping, so they may or may not end up in the same bundle.
    • if they are not in the same bundle the flow of events will be pretty much the same as that for a VCS conflict
    • если они находятся в одном пакете, проверка пакета завершится ошибкой и после действий по разделению пакетов в конечном итоге они окажутся в другом пакете, и снова последует тот же поток событий, что и для конфликта VCS.
person Dan Cornilescu    schedule 20.01.2019
comment
Дэн берет здесь в качестве примера язык C... когда он говорит... прототип функции и определение... - person overexchange; 20.01.2019
comment
К вашему сведению... не будет 3-стороннего слияния, я немного скептически отношусь к этому... 3-стороннее слияние происходит после коммита f2. Трехстороннее слияние не вызывается на основе одной и той же/другой файловой стратегии. Трехстороннее слияние вызывается на основе пути (прямого/косвенного) между master и f2 (любая ветвь, которую необходимо объединить). - person overexchange; 20.01.2019
comment
Извините, под there will be no 3-way merge я подразумеваю, что в таком случае никакие файлы не будут технически объединены, просто будет выбрана другая версия файлов. - person Dan Cornilescu; 20.01.2019
comment
да.... критерий... просто обнаружить конфликт... мне не нужен инструмент для разрешения конфликта... не так ли? Вмешательство человека лучше.... - person overexchange; 20.01.2019
comment
Здесь говорится... Конфликты слияния очень рискованно автоматизировать, что исключает возможность автоматизации вообще. ... пытается ли ApartCI обнаружить конфликт или обнаружить и разрешить конфликт? - person overexchange; 20.01.2019
comment
Вмешательство человека лучше для разрешения конфликтов, да, но для того, чтобы просто обнаружить их, ИМХО предпочтительнее автоматизация. Зачем тратить время разработчика на то, что машина обычно может делать быстрее и лучше? - person Dan Cornilescu; 20.01.2019
comment
Нет, ApartCI не пытается разрешать конфликты, его единственная цель — максимально эффективно изолировать их и передать людям для разрешения, автоматически управляя интеграцией других, не конфликтующих изменений. - person Dan Cornilescu; 20.01.2019