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

После разработки на основе магистрали, показано ниже:


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

Предположим, существует один конвейер 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 запускается при успешном слиянии без конфликтов

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

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


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

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

Примечание: нет плана использовать рабочий процесс Gitflow

1 ответ

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

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

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

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

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

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

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

  • если это конфликт VCS, 2 изменения перекрываются (т. е. они касаются хотя бы одного общего исходного файла), поэтому они не будут объединены для одновременной проверки. Это означает, что они никогда не окажутся в первичной связке вместе. Один из них будет предан и в конечном итоге окажется в основе проекта. Как только это произойдет, другое изменение не будет исправлено в следующей попытке проверки и будет отклонено.
  • если это чисто функциональный конфликт, 2 изменения не пересекаются, поэтому они могут оказаться или не оказаться в одном пакете.
    • если они не находятся в одном и том же пакете, поток событий будет почти таким же, как и для конфликта VCS
    • если они находятся в одном и том же пакете, проверка пакета не удастся, и после действий по расщеплению пакета они в конечном итоге окажутся в другом пакете, и снова последует тот же поток событий, что и для конфликта VCS.
Другие вопросы по тегам