Как правильно использовать Git для получения данных из другой ветки?

Добрый день!  
У меня возникла следующая ситуация: я завершил задачу в ветке branchOne, создал запрос на слияние в мастер и передал его на тестирование. Теперь, когда я начинаю работать над новой задачей в ветке branchTwo, мне становится очевидно, что мне потребуется код из branchOne. Однако branchOne еще не протестирована и, следовательно, не смержена в мастер. 

Как в этой ситуации лучше поступить: 
1. Создать ветку branchTwo из мастера и затем смержить в нее branchOne, 
2. Или просто создать branchTwo на основе ветки branchOne, где уже находятся нужные изменения, 
3. Или, возможно, черрипикнуть коммиты из branchOne в branchTwo? 

Каковы плюсы и минусы каждого из этих подходов, и как вы обычно решаете подобные ситуации? Спасибо!
  • 7 ноября 2024 г. 17:43
Ответы на вопрос 2
Добрый день!

Вы правы, внедрение изменений из одной ветки в другую — это распространённая задача в Git, и каждый из предложенных вами подходов имеет свои плюсы и минусы. Рассмотрим каждую стратегию более детально.

### 1. Создать ветку branchTwo из мастер и затем смержить в нее branchOne.

**Плюсы:**
- Вы начинаете с самой свежей версии `master`, что позволяет избежать проблем с потенциально конфликтующими изменениями, если другие разработчики работают в этом репозитории.
- Это может быть полезно, если `branchOne` еще не завершена, и вы хотите продолжать работу, основываясь на стабильной версии `master`.

**Минусы:**
- Если `branchOne` содержит значительное количество изменений, необходимость мерджить её в `branchTwo` может привести к большим конфликтам.
- Вам нужно будет следить за тем, чтобы изменения в `branchOne` были актуальны и можете потерять актуальность при отсутствии слияния с `master`.

### 2. Создать branchTwo на основе ветки branchOne.

**Плюсы:**
- Это самый простой способ, если вам нужны изменения из `branchOne`, так как вы их получите сразу.
- Вы сможете продолжать разработку второй задачи, не беспокоясь о конфликтах, пока `branchOne` не будет окончательно протестирована.

**Минусы:**
- `branchTwo` становится зависимой от `branchOne`, и если в процессе тестирования выяснится, что в `branchOne` есть ошибки, вам, возможно, придется переосмыслить код в `branchTwo`.
- Если другие разработчики будут работать с `branchOne`, это может привести к путанице.

### 3. Черрипикнуть коммиты из branchOne в branchTwo.

**Плюсы:**
- Вы можете выборочно включать только те изменения, которые вам нужны, избегая ненужного кода из `branchOne`.
- Это позволяет сохранить `branchTwo` более независимой и изолированной от неготовых изменений.

**Минусы:**
- Это потребует больше ручной работы, особенно если вам нужно не один, а несколько коммитов.
- Вы можете пропустить зависимости между коммитами, если они могут потребовать другое поведение, если будут включены только отдельные коммиты.

### Рекомендации:

Чаще всего разработчики выбирают второй способ — создание `branchTwo` на основе `branchOne`, когда изменения из первой ветки уже завершены и вы уверены в их работе. Если же в коде из `branchOne` ещё есть нерешенные проблемы, целесообразнее будет либо создать новую ветку из `master` и кольцевать изменения из `branchOne`, либо использовать cherry-pick.

Таким образом, если в `branchOne` написан код, который вам нужен и в нём нет серьезных ошибок, вам подойдёт создание `branchTwo` на основе `branchOne`. Если же нужно лишь несколько изменений, попробуйте cherry-pick.
В зависимости от ситуации: 
1. Можно изначально отпочковаться от той ветки
2. Можно сделать cherry pick

Зависит от того, что по логике правильнее: просто какое-то точечное изменение (типа в конфиге адреса потрогал) - cherry pick. Если это развитие фичи из другой ветки - лучше от ветки отпочковываться.
Похожие вопросы