Git исключает возврат фиксации при слиянии - PullRequest
3 голосов
/ 27 октября 2011

Используем долгоживущие ветки PROD, TEST et DEV.

Следующая версия приложения разрабатывается в DEV, она объединяется в TEST, когда готов к тестированию, и объединяется в PROD после выпуска.

Некоторые коммиты производятся непосредственно в ветке TEST (для исправления ошибок проверяемой версии) и в PROD (для исправления ошибок).

Эти коммиты в PROD и TEST всегда «объединяются» в дочерние ветви (т. Е. PROD объединяются в TEST и DEV; TEST объединяются в DEV).

Время от времени исправление ошибки фиксируется в PROD, затем объединяется в TEST и DEV, а затем выдвигается в начало координат. Но затем в планировании произошли некоторые изменения, и исправление ошибки должно быть частью версии в TEST, а не версии в PROD.

Теперь вот проблема: если я верну коммит в PROD, реверт будет выполнен также в TEST и DEV, когда PROD будет объединен. Как перейти к удалению изменений в PROD и сохранить их в TEST и DEV даже после слияния PROD?

То, что я сейчас делаю, из ТЕСТА:

git merge PROD --no-commit

Это позволяет мне отменить отмененные изменения в PROD до того, как слияние будет зафиксировано в TEST. Затем выполните слияние из TEST в DEV без особых вмешательств. Если единственный коммит, который должен быть слит с PROD, является обращенным, это приводит к слиянию без файла ... но, тем не менее, это работает.

Так что мне было интересно, если мой подход правильный или есть лучший способ сделать это?

1 Ответ

3 голосов
/ 27 октября 2011

В общем, плохая идея объединить вашу производственную ветку с тестовой. Обычно это git checkout PROD, за которым следует git merge TEST. (Если вы хотите узнать больше об этом практическом правиле, в этом блоге о слияниях и ветвях дается полное обоснование.)

Если кто-то случайно фиксирует исправление в PROD, которое должно было быть на TEST, вам, вероятно, следует выбрать вишню для этого исправления на TEST и вернуть ее на PROD. Чтобы описать это шаг за шагом, давайте предположим, что коммит с исправлением на PROD имеет имя объекта A. Тогда:

 # cherry-pick the commit onto `TEST`.
 git checkout TEST
 git cherry-pick A

 # Now revert the commit on `PROD`:
 git checkout PROD
 git revert A

Теперь, когда вы сливаете TEST с PROD, исправление должно быть объединено. (В зависимости от истории это может привести к конфликту, но в таком случае это должно быть легко разрешено в пользу версии на TEST.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...