W3docs

git branch

Полезная информация о команде git branch: создание, удаление и переименование веток Git с примерами использования.

Что делает git branch

Команда git branch создаёт, перечисляет, переименовывает и удаляет ветки. Это вся её задача — она не переключает рабочее дерево на другую ветку и не выполняет слияние. Эти задачи возложены на git checkout / git switch и git merge. Думайте о git branch как об инструменте, который управляет метками, тогда как другие команды перемещают вас между ними и объединяют их вместе.

На этой странице рассматривается, что такое ветка на самом деле, как создавать и перечислять ветки, как переименовывать и удалять их (локально и на удалённом репозитории), а также типичные ошибки, с которыми сталкиваются разработчики.

git branch

Что такое ветка на самом деле

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

Поскольку ветка — это просто файл размером 41 байт, содержащий хеш коммита, её создание происходит мгновенно и практически ничего не стоит:

cat .git/refs/heads/main
# 9f1c2a7e8d... (the commit your branch currently points at)

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

Зачем использовать ветки

Ветки дают изолированную линию разработки. Вы можете реализовывать функцию или исправлять ошибку в отдельной ветке, не затрагивая стабильную ветку main, а затем влить изменения обратно, когда они будут готовы. Распространённые причины использования веток:

  • Разрабатывать две функции параллельно без конфликтов изменений.
  • Поддерживать main всегда в готовом к выпуску состоянии, пока экспериментальный код живёт в другом месте.
  • Приводить историю в порядок перед слиянием, чтобы общая ветка оставалась чистой.
  • Открывать pull request — большинство платформ строят PR на основе веток.

git branch1

Основные параметры

КомандаЧто делает
git branchПеречисляет локальные ветки (то же, что git branch --list); текущая ветка помечается символом *.
git branch -vПеречисляет ветки с последним хешем коммита и его сообщением.
git branch <branch>Создаёт новую ветку с именем <branch>, но не переключается на неё.
git branch <branch> <start-point>Создаёт <branch>, указывающую на конкретный коммит, тег или ветку.
git branch -d <branch>Удаляет ветку только если её изменения уже слиты.
git branch -D <branch>Принудительно удаляет ветку, даже если есть неслитые изменения (-D = --delete --force).
git branch -m <old> <new>Переименовывает ветку (используйте -M, чтобы перезаписать существующее имя).
git branch -aПеречисляет все ветки — локальные и удалённые.
git branch -rПеречисляет только удалённые ветки.
git branch --mergedПеречисляет ветки, уже слитые с текущей (можно безопасно удалить).
git branch --no-mergedПеречисляет ветки, ещё не слитые с текущей.

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

Ветки — это просто указатели на коммиты. При создании ветки Git добавляет новый указатель на текущий коммит — история не изменяется.

git branch2

Создать ветку на текущем коммите:

git branch test_branch

Создаётся новый указатель на текущий коммит; всё остальное остаётся на месте:

git branch3

Создание ветки не переключает вас на неё — HEAD по-прежнему указывает на старую ветку. Чтобы начать работу на новой ветке, переключитесь на неё, а затем используйте git add и git commit для записи изменений:

git switch test_branch     # modern; or: git checkout test_branch

Чаще всего удобно создать ветку и переключиться на неё за один шаг:

git switch -c test_branch     # create + switch (modern)
git checkout -b test_branch   # create + switch (older syntax, identical effect)

Вы также можете создать ветку не от HEAD, а от конкретной точки — тега, другой ветки или хеша коммита:

git branch hotfix v1.0        # branch starting at the v1.0 tag
git branch experiment 9f1c2a7 # branch starting at an old commit

Просмотр и перечисление веток

Запуск git branch без аргументов показывает локальные ветки и отмечает текущую:

git branch
#   feature-login
# * main
#   test_branch

Добавьте -v, чтобы увидеть, на какой коммит указывает каждая ветка:

git branch -v
#   feature-login 1a2b3c4 Add login form
# * main          9f1c2a7 Update README
#   test_branch   9f1c2a7 Update README

Чтобы определить, какие ветки можно безопасно удалить, выведите список веток, уже слитых с текущей. Все они могут быть удалены с помощью -d:

git branch --merged
#   feature-login
# * main

Переименование веток

Используйте -m (move) для переименования. Чтобы переименовать ветку, на которой вы находитесь, укажите только новое имя:

git branch -m better-name

Чтобы переименовать другую ветку, укажите оба имени — старое и новое:

git branch -m old-name new-name

Если ветка с целевым именем уже существует, -m откажется её перезаписать; используйте -M для принудительного переименования. Обратите внимание, что переименование ветки, существующей на удалённом репозитории, не переименовывает её там — необходимо отправить новое имя и удалить старое.

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

После того как ветка слита в main, удалите локальный указатель, чтобы список веток оставался чистым:

git branch -d test_branch
# Deleted branch test_branch (was 9f1c2a7).

Флаг -d выполняет проверку безопасности: он откажется удалять ветку, чьи коммиты ещё не влиты в текущую ветку, чтобы вы не потеряли работу:

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

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

git branch -D test_branch
Внимание

-D отбрасывает коммиты, существующие только в этой ветке. Такие коммиты становятся недостижимыми и в конечном итоге удаляются сборщиком мусора. Если вы случайно удалили ветку, обычно можно восстановить хеш из git reflog до того, как это произойдёт.

Удаление удалённой ветки

Приведённые выше команды удаляют только локальную копию. Ветка может по-прежнему существовать на удалённом репозитории (например, на origin). Чтобы удалить её там:

git push origin --delete test_branch

Более старый синтаксис с двоеточием делает то же самое — он отправляет «ничего» в удалённую ветку, что её удаляет:

git push origin :test_branch

Чтобы создать ветку на удалённом репозитории, отправьте туда локальную ветку; первая отправка создаёт её на удалённом сервере, а с параметром -u настраивает отслеживание. Подробнее смотрите в git push и git remote:

git push -u origin test_branch
# pushes test_branch to origin and tracks it

Полный пример

Вот типичный цикл создания → работы → слияния → очистки от начала до конца:

git switch -c feature-x        # create and switch to the branch
# ... edit files ...
git add .
git commit -m "Add feature X"

git switch main                # back to main
git merge feature-x            # bring the work in
git branch -d feature-x        # delete the now-merged local branch
git push origin --delete feature-x   # and remove it from the remote

Практика

Практика
Каковы функции и возможности команды 'git branch'?
Каковы функции и возможности команды 'git branch'?
Was this page helpful?