Как правильно провести слияние (merge) изменений из ветки dev в ветку main, если в dev есть незавершенные фичи?

Как правильно мерджить ветку, созданную от другой ветки, если исходная ветка содержит изменения, которые не должны попасть в целевую ветку? Каким образом организовать работу с отдельными задачами, если предыдущие задачи еще не утверждены?
  • 25 января 2024 г. 9:51
Ответы на вопрос 2
Чтобы правильно провести слияние (merge) изменений из ветки `dev` в ветку `main`, когда в `dev` есть незавершенные фичи, можно использовать несколько подходов:

### Feature Toggle / Feature Flag
Если незавершенные фичи могут быть изолированы с помощью feature toggles (флагов, включающих или выключающих определённые функции), то можно смержить `dev` в `main`, при этом держа фичи в выключенном состоянии до их полного завершения.

### Feature Branch Workflow
Организовать работу с помощью feature branches (веток для отдельных фич):

1. Создать отдельные ветки для каждой незавершенной фичи из `dev`, если таковые ещё не созданы.
2. По завершении работы с фичей сначала смерджить изменения из `main` в эту feature branch, чтобы убедиться в отсутствии конфликтов и корректной работе фичи с последними изменениями из `main`.
3. Смерджить только готовые к релизу ветки фич в `main`.

### Cherry-Picking
Если нужно перенести только конкретные изменения (коммиты), можно использовать cherry-pick:

1. Просмотреть историю коммитов в `dev` и определить, какие из них относятся к завершенным фичам.
2. Выполнить cherry-pick этих коммитов в `main`.

### Интерактивный Rebase
Если изменения по незавершенным фичам группируются в отдельные коммиты, можно использовать интерактивный rebase для редактирования истории коммитов перед мержем:

1. Выполнить интерактивный rebase ветки `dev`, чтобы исключить или переупорядочить коммиты с незавершенными фичами.
2. После этого смерджить "очищенную" историю изменений в `main`.

### Избегаемые подходы

- **Squash Merging**: Этот метод объединяет все коммиты из feature branch в один коммит в `main`, что может быть полезно, но он не подходит, если в ветке есть коммиты с незавершенными фичами, которые не должны попадать в `main`.
- **Rebase Merging**: Этот метод перебазирует все коммиты из feature branch в начало `main`, но также не подходит для незавершенных фич.

### Работа с отдельными задачами, если предыдущие задачи еще не утверждены

Лучший подход — использовать Git Flow или Feature Branch Workflow, где каждая новая задача начинается в новой ветке, созданной от последнего стабильного состояния `main` (или `develop`, в зависимости от принятой стратегии). Если новая задача зависит от изменений в предыдущей еще не утвержденной задаче, можно временно базировать новую ветку на этой незавершенной ветке, но перед вливанием в главную ветку следует перебазировать её на `main` (или `develop`), чтобы гарантировать, что она содержит только утвержденные изменения.
Решение более правильное - не делать так. Мержить надо когда все работает, а если есть неработающий функционал, то: 
- Либо комментировать функциональность которая еще не работает
- Либо сделать эту функциональность доступной через фича-флаги. Эти флаги соответственно никто не должен выставлять
- Либо мержить только работающие ветки, а та, в которой не работает/не закончена - в нее мержить уже готовую мастер ветку

Мержить через cherry-pick - такое себе: одна ошибка и ты ошибся (фатально)
Похожие вопросы