В системах, которые записывают полную историю слияний (например, системы на основе DAG , такие как Git, Mercurial и другие), может иметь смысл разрабатывать функции и исправления ветвей, которые разветвляются из самых старых место, которое потребует особых изменений.
Это облегчает объединение готовой ветви со всеми целевыми ветвями.
Вы начинаете с development
.
--o--o--o development
В конце концов, вы решаете, что контент готов к использованию. Вы делаете ветку production
. Работа продолжается на development
, но эта работа еще не подходит для production
(что означает, что вы не должны пытаться объединить development
в production
).
--o--o--o--o production
\
o--o--o development
Обнаружена ошибка, которую необходимо исправить в обеих ветках.
Ветвь для изменений исправления ошибки должна быть разветвлена от общего предка всех ветвей, которые будут нуждаться в исправлении.
--o--o--o--o production
|\
| \------o--o bugfix-1
\
o--o--o development
Как только исправление готово, оно объединяется в production
и development
. Это возможно, потому что bugfix-1
разветвляется от общего предка обеих ветвей.
--o--o--o--o----------o production
|\ /
| \------o--o bugfix-1
\ \
o--o--o-----o development
Вместо того, чтобы просто использовать общего предка, вы можете даже разветвить ветку исправления ошибки из коммита, который представил ошибку. Это гарантирует, что исправление ошибки может быть объединено с любой возможной веткой, которая сама включает в себя некорректный коммит (поскольку в полностью распределенной системе вы можете не знать обо всех ветвях, которые используют некорректный коммит).
«Исправление» ветвится с Удачная модель ветвления Git является разновидностью этого типа рабочего процесса. У сопровождающего Git есть запись в блоге о целях ветвей , которая также может помочь прояснить, как / почему следует создавать ветви и как их эффективно использовать, когда их контент может использоваться в нескольких дочерних ветвях (например, почему вы можете хотите избежать слияния ветки 'upstream' с веткой Feature).
Если вы работаете наоборот (извлеките ветку исправления ошибок из коммита, который находится только на одной из ваших целевых ветвей), вам в конечном итоге придется «переиграть» (то есть «выбрать вишню» или «перебазировать») отдельные изменения из ветви исправления ошибок в другие целевые ветви вместо обычного слияния. Этот метод будет работать, но это означает, что вы должны отслеживать все воплощения ветви исправления ошибок, чтобы проверить, содержит ли конкретная целевая ветвь (версию) исправления ошибки (или использовать ручную проверку кода).
Исправить ошибку «поверх» development
.
--o--o--o--o production
\
o--o--o development
\
b--b bugfix-1
Объедините его с development
(пример показывает, что в Git называется слиянием без ускоренной перемотки), и перебазируйте / cherry-pick коммит исправления ошибки (b
) на production
(b'
), поскольку объединение development
в production
было бы плохой идеей - не весь его контент готов к производству:
--o--o--o--o--b'--b' production
\
o--o--o------o development
\ /
b--b bugfix-1
Зафиксированных взаимосвязей между фиксациями b
и b'
в ветке production
нет. Это отсутствие взаимосвязи означает, что вам нужно спросить о коммитах b
и b'
, если вы хотите быть в состоянии ответить на вопрос «Есть ли у какой-нибудь ветви, W, исправлена ли ошибка?» Автоматически.