Files
aston-team-project/tutorials/git/GIT_BRANCH_DEPENDENCIES.ru.md
T

4.5 KiB
Raw Blame History

Работа с зависимостями между Git-ветками

Сценарий

Предположим, мы находимся в ветке:

feature/student

В этой ветке реализуется функциональность, связанная со Student.

При этом у нас появляется новая, независимая по смыслу фича:

feature/sorting

Для реализации сортировки нам необходим класс или интерфейс Student, который уже был создан в feature/student.

Как создать новую ветку

Если нам необходимо продолжить разработку feature/sorting, используя текущее состояние feature/student, создаём новую ветку от feature/student.

Сначала переключаемся на feature/student:

git checkout feature/student

Затем создаём новую ветку:

git branch feature/sorting

После этого история будет выглядеть примерно так:

                 feature/sorting
                /
---------------●
                \
                 feature/student

Обе ветки на момент создания указывают на один и тот же коммит.

Теперь в feature/sorting доступен весь код, который был добавлен в feature/student, в том числе Student.

Чтобы перейти в новую ветку:

git checkout feature/sorting

Почему важно создавать ветку именно таким образом

В данном случае feature/sorting зависит от кода, находящегося в feature/student.

При этом сами фичи логически разные:

  • feature/student — разработка Student;
  • feature/sorting — реализация сортировки;
  • Student нужен в feature/sorting как зависимость для реализации сортировки.

Поэтому не стоит продолжать разработку сортировки непосредственно в feature/student. Лучше создать отдельную ветку от того состояния, где необходимый код уже существует.


Если ветки уже разошлись

Иногда невозможно создать feature/sorting непосредственно от нужного места в истории feature/student.

Например, feature/sorting уже была создана раньше:

A---B---C---D  feature/student
     \
      E---F---G  feature/sorting

В таком случае можно получить изменения из feature/student посредством слияния (merge).

Находясь в feature/sorting, выполняем:

git checkout feature/sorting
git merge feature/student

История станет примерно такой:

A---B---C---D  feature/student
     \       \
      E---F---G---M  feature/sorting

Коммит M — результат слияния двух веток.

После этого в feature/sorting будут доступны изменения из feature/student, в том числе необходимый Student.

Главное правило

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

Если новую ветку можно создать непосредственно от нужного состояния исходной ветки:

git checkout feature/student
git branch feature/sorting

Если ветки уже разошлись и создать её от нужного состояния невозможно:

git checkout feature/sorting
git merge feature/student

Таким образом, мы сохраняем логическое разделение фич и одновременно можем использовать необходимый код из другой ветки.