Using branches

Git branch


В этом документе подробно описывается команда git branch и рассматривается модель ветвления в Git. Возможность ветвления доступна в большинстве современных систем контроля версий, но может быть довольно затратной операцией как по времени, так и по объему дискового пространства. В Git ветки — составляющая повседневного процесса разработки. Ветки в Git по сути представляют собой указатель на снимок изменений. Когда вы хотите добавить новую функцию или фикс для бага, хоть мелкий, хоть серьезный, вы создаете новую ветку, в которую будут заключены ваши изменения. Это затрудняет слияние нестабильного кода с основной базой кода и дает возможность очистить историю перед слиянием с основной веткой.


This document is an in-depth review of the git branch command and a discussion of the overall Git branching model. Branching is a feature available in most modern version control systems. Branching in other VCS's can be an expensive operation in both time and disk space. In Git, branches are a part of your everyday development process. Git branches are effectively a pointer to a snapshot of your changes. When you want to add a new feature or fix a bug—no matter how big or how small—you spawn a new branch to encapsulate your changes. This makes it harder for unstable code to get merged into the main code base, and it gives you the chance to clean up your future's history before merging it into the main branch.

Git Tutorial: git branch

На схеме выше показан репозиторий с двумя отдельными направлениями разработки, одно для мелкой функции, а второе — для более масштабной. Ведение разработки в ветках не только позволяет работать над ними параллельно, но и не предотвращает попадание сомнительного кода в основную ветку master.

Git предлагает облегченную реализацию веток по сравнению с другими системами контроля версий. Вместо того чтобы копировать файлы из каталога в каталог, Git хранит ветку в виде ссылки на коммит. Получается, что ветка представляет собой вершину серии коммитов, а не контейнер для коммитов. История ветки распространяется через иерархические отношения с другими коммитами.

Во время чтения помните, что ветки в Git не похожи на ветки в SVN. Ветки в SVN используются только для фиксации периодических крупномасштабных наработок, а ветки в Git являются неотъемлемой частью повседневного рабочего процесса. Далее приводится более подробное описание внутренней архитектуры ветвления в Git.

Порядок действий

Ветка представляет собой отдельное направление разработки. Ветки выступают в качестве абстрактного представления для процесса редактирования/индексации/коммита. Можно рассматривать их как способ запросить новый рабочий каталог, раздел проиндексированных файлов и историю проекта. Новые коммиты записываются в историю текущей ветки, что приводит к образованию развилки в истории проекта.

Команда git branch позволяет создавать, просматривать, переименовывать и удалять ветки, но не дает возможности переключаться между ветками или сливать раздвоенную историю воедино. Именно поэтому команда git branch тесно взаимосвязана с командами git checkout и git merge.

Распространенные опции

git branch

Вывод списка всех веток в репозитории. Это синоним команды git branch --list.

git branch <ветка>

Создание новой ветки с именем <ветка>. Эта команда не выполняет переключение на эту новую ветку.

git branch -d <ветка>

Удаление указанной ветки. Это «безопасная» операция, поскольку Git не позволит удалить ветку, если в ней есть неслитые изменения.

git branch -D <ветка>

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

git branch -m <ветка>

Изменение имени текущей ветки на <ветка>.

git branch -a

Вывод списка всех удаленных веток. 

Создание веток

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

Git Tutorial: repository without any branches

Затем вы создаете новую ветку с помощью следующей команды.

git branch crazy-experiment

История репозитория остается неизменной. Все, что вы получаете, — это новый указатель на текущий коммит:

Git Tutorial: Create new branch

Обратите внимание, что эта команда только создает новую ветку. Для того чтобы добавить в эту ветку коммиты, необходимо выбрать ее с помощью команды git checkout, а затем использовать стандартные команды git add и git commit

Создание удаленных веток

До сих пор все эти примеры демонстрировали работу с локальными ветками. Команда git branch также работает с удаленными ветками. Для выполнения операций на удаленных ветках сначала необходимо настроить удаленный репозиторий и добавить его в конфигурацию локального репозитория.

$ git remote add new-remote-repo https://bitbucket.com/user/repo.git
# Добавление удаленного репозитория в конфигурацию локального репозитория
$ git push <new-remote-repo> crazy-experiment~
# Помещение ветки crazy-experiment в новый удаленный репозиторий new-remote-repo

Эта команда поместит копию локальной ветки crazy-experiment в удаленный репозиторий <remote>.

Удаление веток

После того как вы завершите работу в ветке и сольете ее с основной базой кода, эту ветку можно будет удалить без потери истории:

git branch -d crazy-experiment

Однако, если ветка не была слита, указанная выше команда выдаст сообщение об ошибке:

error: The branch 'crazy-experiment' is not fully merged.
If you are sure you want to delete it, run 'git branch -D crazy-experiment'.

Это защищает от потери доступа ко всей проделанной работе по этому направлению. Если вы действительно хотите удалить ветку (например, если эксперимент оказался неудачным), используйте флаг -D (с прописной буквой):

git branch -D crazy-experiment

Эта команда удаляет ветку независимо от ее состояния и не выдает никаких предупреждений, поэтому используйте ее с осторожностью.

Предыдущие команды удаляют локальную копию ветки, но ветка может сохраниться в удаленных репозиториях. Для удаления ветки из удаленного репозитория выполните следующую команду.

git push origin --delete crazy-experiment

или

git push origin :crazy-experiment

Эта команда отправит удаленному репозиторию сигнал на удаление ветки crazy-experiment.

Резюме


В этом документе мы рассмотрели поведение механизма ветвления в Git и команду git branch. Основные функции команды git branch — это создание, просмотр, переименование и удаление веток. Для дальнейшей работы с полученными ветками обычно используются другие команды, такие как git checkout. Подробнее об операциях с ветками с помощью команды git checkout, например о переключении между ветками и их слиянии, см. на странице git checkout.

По сравнению с другими системами контроля версий операции над ветками в Git выполнять просто, поэтому они пользуются часто. Такая гибкость предоставляет мощные возможности для настройки рабочего процесса в Git. Дополнительную информацию о рабочих процессах в Git см. на страницах с подробным описанием
рабочего процесса с функциональными ветками
, рабочего процесса Gitflow и рабочего процесса с форками

Готовы попробовать создать ответвление?

Ознакомьтесь с этим интерактивным обучающим руководством.

Начните прямо сейчас