docs: add guide for dependencies between git branches
This commit is contained in:
@@ -0,0 +1,122 @@
|
|||||||
|
# Работа с зависимостями между Git-ветками
|
||||||
|
|
||||||
|
## Сценарий
|
||||||
|
|
||||||
|
Предположим, мы находимся в ветке:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
feature/student
|
||||||
|
```
|
||||||
|
|
||||||
|
В этой ветке реализуется функциональность, связанная со `Student`.
|
||||||
|
|
||||||
|
При этом у нас появляется новая, независимая по смыслу фича:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
feature/sorting
|
||||||
|
```
|
||||||
|
|
||||||
|
Для реализации сортировки нам необходим класс или интерфейс `Student`, который уже был создан в `feature/student`.
|
||||||
|
|
||||||
|
## Как создать новую ветку
|
||||||
|
|
||||||
|
Если нам необходимо продолжить разработку `feature/sorting`, используя текущее состояние `feature/student`, создаём новую ветку **от `feature/student`**.
|
||||||
|
|
||||||
|
Сначала переключаемся на `feature/student`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout feature/student
|
||||||
|
```
|
||||||
|
|
||||||
|
Затем создаём новую ветку:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git branch feature/sorting
|
||||||
|
```
|
||||||
|
|
||||||
|
После этого история будет выглядеть примерно так:
|
||||||
|
|
||||||
|
```text
|
||||||
|
feature/sorting
|
||||||
|
/
|
||||||
|
---------------●
|
||||||
|
\
|
||||||
|
feature/student
|
||||||
|
```
|
||||||
|
|
||||||
|
Обе ветки на момент создания указывают на один и тот же коммит.
|
||||||
|
|
||||||
|
Теперь в `feature/sorting` доступен весь код, который был добавлен в `feature/student`, в том числе `Student`.
|
||||||
|
|
||||||
|
Чтобы перейти в новую ветку:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout feature/sorting
|
||||||
|
```
|
||||||
|
|
||||||
|
## Почему важно создавать ветку именно таким образом
|
||||||
|
|
||||||
|
В данном случае `feature/sorting` зависит от кода, находящегося в `feature/student`.
|
||||||
|
|
||||||
|
При этом сами фичи логически разные:
|
||||||
|
|
||||||
|
- `feature/student` — разработка `Student`;
|
||||||
|
- `feature/sorting` — реализация сортировки;
|
||||||
|
- `Student` нужен в `feature/sorting` как зависимость для реализации сортировки.
|
||||||
|
|
||||||
|
Поэтому не стоит продолжать разработку сортировки непосредственно в `feature/student`. Лучше создать отдельную ветку от того состояния, где необходимый код уже существует.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Если ветки уже разошлись
|
||||||
|
|
||||||
|
Иногда невозможно создать `feature/sorting` непосредственно от нужного места в истории `feature/student`.
|
||||||
|
|
||||||
|
Например, `feature/sorting` уже была создана раньше:
|
||||||
|
|
||||||
|
```text
|
||||||
|
A---B---C---D feature/student
|
||||||
|
\
|
||||||
|
E---F---G feature/sorting
|
||||||
|
```
|
||||||
|
|
||||||
|
В таком случае можно получить изменения из `feature/student` посредством слияния (merge).
|
||||||
|
|
||||||
|
Находясь в `feature/sorting`, выполняем:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout feature/sorting
|
||||||
|
git merge feature/student
|
||||||
|
```
|
||||||
|
|
||||||
|
История станет примерно такой:
|
||||||
|
|
||||||
|
```text
|
||||||
|
A---B---C---D feature/student
|
||||||
|
\ \
|
||||||
|
E---F---G---M feature/sorting
|
||||||
|
```
|
||||||
|
|
||||||
|
Коммит `M` — результат слияния двух веток.
|
||||||
|
|
||||||
|
После этого в `feature/sorting` будут доступны изменения из `feature/student`, в том числе необходимый `Student`.
|
||||||
|
|
||||||
|
## Главное правило
|
||||||
|
|
||||||
|
**Если новая фича зависит от кода из другой ветки, но при этом является самостоятельной по смыслу — создаём для неё отдельную ветку, используя нужную ветку как основу.**
|
||||||
|
|
||||||
|
Если новую ветку можно создать непосредственно от нужного состояния исходной ветки:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout feature/student
|
||||||
|
git branch feature/sorting
|
||||||
|
```
|
||||||
|
|
||||||
|
Если ветки уже разошлись и создать её от нужного состояния невозможно:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout feature/sorting
|
||||||
|
git merge feature/student
|
||||||
|
```
|
||||||
|
|
||||||
|
Таким образом, мы сохраняем логическое разделение фич и одновременно можем использовать необходимый код из другой ветки.
|
||||||
Reference in New Issue
Block a user