Когда вы выбираете коммит, новая версия получает новый идентификатор коммита. Позже, когда вы объединяетесь, git видит два разных идентификатора фиксации и поэтому предполагает, что это два разных набора изменений. Поскольку он не может решить, какой набор изменений применить, вы получите конфликт, который необходимо разрешить вручную - даже если это точно такой же набор изменений. Из соображений эффективности, git не выполняет сравнение файлов - он использует идентификатор фиксации, чтобы определить, были ли применены изменения.
Короче говоря, способ избежать этого - не выбирать вишню, а объединять - тогда один и тот же идентификатор фиксации находится в обеих ветвях, и git распознает внесенные изменения.
Лично мне очень нравится процесс, описанный GitFlow , но из того, что вы упомянули о вашем процессе, я думаю вам просто нужно переключиться с выбора вишни на слияние с выпуском - > развивать.
Итак, ваша команда будет:
- Сделать коммит в
release
- Переместить изменение обратно, чтобы развить с помощью
git merge
- Повторите
Поскольку идентификатор фиксации между ветвями будет одинаковым, каждая операция слияния будет применять только те изменения, которые еще не были применены к develop
. Таким образом, даже если что-то было изменено в develop
, вы получите конфликт только в том случае, если оно также было недавно изменено в release
.
Поскольку вы упоминаете, что людям неудобно (потенциально) объединять коммиты других людей при синхронизации выпуска для разработки, следующий процесс позволит избежать этой проблемы:
- Обрабатывать
release
как master
и develop
- т.е. прямые коммиты не допускаются
- Когда разработчику нужно начать работу, сделайте ветку «Feature» из
release
- После завершения разработки (и просмотра, если применимо), объедините изменение из «функции» в
release
- Затем сделайте второе слияние с «фичей» в
develop
Теперь release
и develop
будут иметь одинаковые изменения, и каждый разработчик будет нести ответственность только за свои конфликты.
ПРИМЕЧАНИЕ: это приводит ко многим дополнительным коммитам слияния, и они появятся при слиянии release
в develop
. Однако поскольку коммиты слияния из release
должны быть пустыми изменениями, я ожидаю, что конфликты почти не будут существовать. Кроме того, история Git станет очень запутанным. Лично я не считаю, что проблема и процесс ребазирования, которые вам нужно использовать, чтобы избежать ее, имеют свою собственную кривую обучения.