# Работа с зависимостями между 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 ``` Таким образом, мы сохраняем логическое разделение фич и одновременно можем использовать необходимый код из другой ветки.