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