Олег Марков
Создание ветки в Git - git branch
Введение
Ветки в Git — это основа удобной командной разработки и безопасных экспериментов с кодом. Когда вы создаете ветку, вы получаете отдельную «линию» разработки, в которой можно вносить изменения, не затрагивая основную кодовую базу. Если что-то пойдет не так, вы всегда можете вернуться к стабильному состоянию.
Команда git branch отвечает за управление ветками: их создание, удаление, переименование и просмотр. Смотрите, я покажу вам, как она работает в разных сценариях — от простых до тех, с которыми вы столкнетесь в реальных проектах.
В этой статье мы разберем:
- что такое ветка в Git и как она устроена внутри;
- как создавать ветки разными способами;
- как переключаться между ветками и работать с ними в связке с git checkout и git switch;
- как безопасно удалять и переименовывать ветки;
- как работать с удаленными ветками (origin/my-feature и т.п.);
- типичные ошибки при создании веток и как их избегать.
Что такое ветка в Git и как она устроена
Ветка как указатель на коммит
Важно понимать, что в Git ветка — это не копия файлов, а просто «указатель» на конкретный коммит.
Представьте цепочку коммитов:
- A — первый коммит;
- B — следующий;
- C — еще один коммит.
Если у вас есть ветка main, она просто указывает на последний коммит в цепочке, например на C. Когда вы делаете новый коммит D, Git сдвигает указатель ветки main на D.
HEAD (специальный указатель) обычно указывает на ветку, а ветка уже — на коммит. Это важно для понимания, когда вы будете создавать ветки «от середины истории».
Локальные и удаленные ветки
Вы будете иметь дело с двумя основными типами веток:
- локальные ветки — живут только в вашем локальном репозитории, например
main,develop,feature/login; - удаленные ветки — ссылки на ветки на сервере, например
origin/main,origin/feature/login.
Команда git branch в основном работает с локальными ветками, но умеет отображать и удаленные ссылки и создавать локальные ветки на их основе.
Базовая проверка состояния перед созданием ветки
Перед тем как создавать новую ветку, полезно убедиться, что:
- вы находитесь в нужном репозитории;
- ваш рабочий каталог чистый (нет незакоммиченных изменений, если они не нужны в новой ветке);
- вы стоите на нужной исходной ветке или нужном коммите.
Чтобы быстро проверить состояние, запустите:
git status
# Показывает текущую ветку и статус файлов
Пример вывода:
On branch main
nothing to commit, working tree clean
Комментарий:
On branch main— вы сейчас в веткеmain;working tree clean— нет незакоммиченных изменений.
Если вы видите измененные файлы, решите, что с ними делать: закоммитить, закоммитить частично (через git add -p) или отложить (stash), прежде чем переходить к новой ветке.
Просмотр существующих веток
Прежде чем создавать новую ветку, удобно посмотреть, какие ветки уже есть.
Локальные ветки
git branch
# Показывает все локальные ветки
Пример вывода:
develop
* main
feature/login
Звездочка показывает, в какой ветке вы сейчас находитесь.
Локальные и удаленные ветки
git branch -a
# -a означает all - все ветки (локальные и удаленные)
Пример:
* main
develop
feature/login
remotes/origin/main
remotes/origin/develop
remotes/origin/feature/old-branch
Удаленные ветки помечены префиксом remotes/origin/….
Только удаленные ветки
git branch -r
# -r означает remote - только удаленные ветки
Это удобно, если вы хотите создать локальную ветку на основе уже существующей удаленной.
Создание ветки: базовый синтаксис git branch
Самый простой вариант: создать ветку от текущего состояния
Наиболее распространенный сценарий — вы стоите в ветке main или develop и хотите создать новую ветку для задачи.
git branch feature/login-form
# Создаем новую ветку feature/login-form от текущего коммита
Обратите внимание: эта команда только создает ветку, но не переключает вас на нее. Вы все еще остаетесь в исходной ветке.
Проверим:
git branch
# Убедимся, что ветка создалась
Вывод может выглядеть так:
develop
* main
feature/login-form
Создание и переключение одной командой: git checkout -b и git switch -c
Чтобы не выполнять две команды (создать ветку и потом переключиться), применяют следующую форму:
git checkout -b feature/login-form
# -b - значит create branch - создать ветку и сразу перейти в нее
или более современный вариант (Git 2.23+):
git switch -c feature/login-form
# -c - create - создать ветку и переключиться
Теперь вы сразу оказываетесь в новой ветке. Проверяем:
git status
# Покажет текущую ветку
Пример:
On branch feature/login-form
nothing to commit, working tree clean
Создание ветки от конкретной ветки или коммита
Иногда вам нужно создать ветку не от текущего состояния, а от другой ветки или конкретного коммита.
Смотрите, я покажу вам несколько вариантов.
От другой ветки
git branch hotfix/payment-bug origin/main
# Создаем ветку hotfix/payment-bug от состояния origin/main
Здесь:
hotfix/payment-bug— имя новой ветки;origin/main— коммит или ветка, от которой она создается.
Аналогично можно указать локальную ветку:
git branch release/1.2 develop
# Создаем ветку release/1.2 от ветки develop
От конкретного коммита (по хешу)
git branch experiment-ui 7a9c2f4
# Создаем ветку experiment-ui от указанного коммита
Часто берут первые 7–10 символов SHA-1 хеша, которых достаточно для уникальной идентификации в большинстве репозиториев.
Чтобы увидеть хеши коммитов, можно воспользоваться:
git log --oneline
# Краткий лог с короткими хешами
Пример:
7a9c2f4 Fix button alignment
37bc112 Add signup form
c5c1a99 Initial commit
Теперь вы видите, от какого коммита удобнее всего создать ветку.
Переключение между ветками
Создание ветки практически всегда связано с последующим переключением.
Переключение через git checkout
git checkout feature/login-form
# Переходим в уже существующую ветку
Git обновит файлы в рабочем каталоге до состояния этой ветки.
Переключение через git switch
Современный способ, более «читаемый»:
git switch feature/login-form
# То же самое, что git checkout для ветки
Проверка успешного переключения
git status
# Проверяем, в какой ветке мы сейчас
или
git branch
# Текущая ветка будет помечена звездочкой
Если у вас есть незакоммиченные изменения, которые конфликтуют с состоянием файлов в целевой ветке, Git может отказать в переключении. В этом случае:
- сохраните изменения в коммит;
- или поместите их во временное хранилище (stash);
- или отмените (reset/checkout отдельных файлов), если они больше не нужны.
Создание ветки от удаленной ветки (origin)
Частый сценарий: в репозитории на сервере уже есть ветка, а вам нужно создать на ее основе локальную ветку и привязать отслеживание.
Простой вариант: git checkout -b с указанием origin
git checkout -b feature/payment origin/feature/payment
# Создаем локальную ветку feature/payment на основе удаленной origin/feature/payment
Комментарии:
- первая часть — имя локальной ветки;
- вторая — удаленная ветка, от которой берется состояние.
При этом Git автоматически устанавливает «upstream» (отслеживаемую ветку). Это значит, что потом команды вроде git push и git pull будут работать без дополнительных параметров, так как Git знает, с какой удаленной веткой синхронизироваться.
Тот же сценарий с git switch:
git switch -c feature/payment origin/feature/payment
# Современный эквивалент создания ветки от удаленной
Когда удаленная ветка есть, а локальной еще нет
Вы можете сначала просто стянуть все ветки с сервера:
git fetch
# Обновляем информацию об удаленных ветках
Потом посмотреть, какие есть удаленные ветки:
git branch -r
# Список удаленных веток
А затем создать локальную ветку:
git branch feature/analytics origin/feature/analytics
# Создаем локальную ветку, не переключаясь
И уже позже перейти в нее:
git switch feature/analytics
# Переходим в только что созданную ветку
Именование веток: практические рекомендации
Правильные имена веток сильно упрощают работу команды.
Общие правила
- используйте только латиницу, цифры, дефис
-и слэш/для группировки; - избегайте пробелов и спецсимволов;
- старайтесь делать имя коротким, но понятным.
Примеры удачных имен:
feature/login-form;bugfix/order-total-rounding;hotfix/production-crash-2025-01-03;release/1.3.0.
Часто используемые префиксы
Во многих командах применяют такую схему:
feature/…— новые фичи;bugfix/…илиfix/…— исправления багов;hotfix/…— срочные исправления в продакшене;release/…— подготовка релизов.
Пример:
git branch feature/user-profile-page
# Ветка для разработки страницы профиля
Старайтесь, чтобы имя ветки давало представление о задаче, например, по номеру тикета:
git branch feature/1234-user-profile-page
# 1234 - номер задачи в трекере
Удаление веток: безопасная работа с git branch -d и -D
Когда ветка больше не нужна (например, ее изменения уже слиты в main), ее можно удалить.
Удаление локальной ветки: безопасный режим
git branch -d feature/login-form
# Удаляем локальную ветку feature/login-form, но только если она слита
Флаг -d (delete) безопасен: если ветка не слита ни в одну другую ветку (обычно в текущую), Git откажется ее удалять и покажет предупреждение.
Пример сообщения:
error: The branch 'feature/login-form' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/login-form'.
Принудительное удаление локальной ветки
Если вы уверены, что ветка больше не нужна, и готовы потерять ее уникальные коммиты (если они никуда не влиты), используйте:
git branch -D feature/login-form
# Принудительное удаление ветки, даже если она не слита
Флаг -D — это сокращение для --delete --force.
Удаление удаленной ветки
Для полного порядка нужно удалить ветку не только локально, но и на сервере.
Через git push:
git push origin --delete feature/login-form
# Удаляем ветку feature/login-form на удаленном репозитории
Или устаревший, но все еще поддерживаемый синтаксис:
git push origin :feature/login-form
# Пуш "пустоты" вместо ветки - тем самым удаляем ее
После этого можно обновить список веток:
git fetch --prune
# Удаляем ссылки на несуществующие уже удаленные ветки
Переименование ветки
Иногда имя ветки приходится менять, например, чтобы сделать его более понятным или привести к стандарту.
Переименование текущей ветки
git branch -m new-name
# Переименовываем текущую ветку в new-name
Комментарии:
-mозначает move/rename — переименование;- старое имя можно не указывать, если вы сейчас находитесь в переименовываемой ветке.
Пример:
git branch -m feature/login-form feature/auth-login-form
# Переименовываем ветку с указанием старого и нового имени
Синхронизация переименованной ветки с удаленным репозиторием
Если ветка уже была запушена на сервер, после переименования локально нужно:
Удалить старую удаленную ветку:
git push origin --delete old-name # Удаляем старую ветку на сервереЗапушить новую ветку и установить отслеживание:
git push -u origin new-name # Публикуем ветку с новым именем и включаем отслеживание
Флаг -u устанавливает «upstream» — теперь git push и git pull можно вызывать без аргументов.
Просмотр информации о ветках: полезные флаги git branch
Показать коммиты, на которые указывают ветки
git branch -v
# Показывает ветки с последним коммитом по каждой
Пример:
develop 37bc112 Add API client
* main c5c1a99 Merge branch 'develop'
feature/login-form 7a9c2f4 Fix button alignment
Здесь вы видите короткий хеш и сообщение последнего коммита для каждой ветки.
Фильтрация веток
Посмотрите, как можно искать ветки по шаблону:
git branch --list "feature/*"
# Список веток, начинающихся с feature/
Это полезно, когда веток становится много.
Пометка отслеживаемых веток
git branch -vv
# Дополнительно показывает, какую удаленную ветку отслеживает каждая локальная
Пример вывода:
* main c5c1a99 [origin/main] Merge branch 'develop'
develop 37bc112 [origin/develop] Add API client
feature/login-form 7a9c2f4 [origin/feature/login-form] Fix button alignment
Здесь в квадратных скобках указана удаленная ветка, с которой синхронизируется данная локальная ветка.
Практический рабочий процесс: от задачи до завершения ветки
Давайте разберем типичный сценарий, через который вы будете проходить снова и снова.
Шаг 1. Обновить основную ветку
git switch main
# Переходим в основную ветку
git pull
# Обновляем ее с сервера
Комментарий:
- мы убеждаемся, что новая ветка будет создана от актуального состояния.
Шаг 2. Создать ветку для задачи
git switch -c feature/1234-user-profile
# Создаем и сразу переходим в ветку для задачи 1234
Шаг 3. Работать над изменениями и коммитить
# Редактируем файлы проекта
git status
# Проверяем, что изменилось
git add src/profile.go
# Добавляем нужные файлы в индекс
git commit -m "Add basic user profile page"
# Фиксируем изменения в коммите
Комментарии:
- коммиты остаются внутри ветки и не затрагивают
main.
Шаг 4. Периодически пушить ветку на сервер
git push -u origin feature/1234-user-profile
# Первый пуш ветки на сервер с установкой отслеживания
Дальше достаточно:
git push
# Отправить новые коммиты в эту же ветку на сервер
Шаг 5. Завершить работу с веткой
После ревью и слияния ветки (через pull request или локально) можно:
Переключиться в основную ветку и обновиться:
git switch main git pullУдалить локальную ветку:
git branch -d feature/1234-user-profile # Безопасное удаление локальной веткиУдалить ветку на сервере (если это нужно по процессу):
git push origin --delete feature/1234-user-profile
Такой цикл повторяется для каждой задачи.
Типичные проблемы и ошибки при создании веток
Проблема 1. Ветка создана не от той базовой ветки
Ситуация: вы думали, что стоите в main, а на самом деле были в develop. В итоге новая ветка включает лишние коммиты.
Как это заметить:
- git log показывает коммиты, которых не должно быть;
- при создании pull request появилось слишком много изменений.
Как исправить:
Убедитесь, от какой ветки вы хотели начать (например,
main).Посмотрите, какой коммит в
mainдолжен быть базовым:git switch main git log --oneline -5 # Находим нужный базовый коммитПереключитесь в «неправильно» созданную ветку:
git switch feature/wrong-baseПересоздайте ветку правильно (один из вариантов — через новую ветку и cherry-pick):
создайте новую ветку от правильной базовой:
git switch main git switch -c feature/correct-baseперенесите нужные коммиты через cherry-pick или заново внесите изменения.
Старую ветку можно удалить после переноса изменений.
Проблема 2. Нельзя переключиться в ветку из-за незакоммиченных изменений
Сообщение Git:
error: Your local changes to the following files would be overwritten by checkout:
src/app.go
Please commit your changes or stash them before you switch branches.
Это значит, что:
- в текущей ветке есть незакоммиченные изменения в файле;
- в целевой ветке этот файл отличается;
- если переключиться, изменения потеряются.
Варианты решения:
Закоммитить изменения:
git add src/app.go git commit -m "WIP changes to app.go" git switch other-branchВременно отложить изменения:
git stash # Сохраняем текущие изменения во временное хранилище git switch other-branch # Теперь переключение возможноОткатить изменения, если они не нужны:
git restore src/app.go # Отменяем незакоммиченные изменения в файле git switch other-branch
Проблема 3. Попытка создать ветку с уже существующим именем
git branch feature/login-form
# ...
fatal: A branch named 'feature/login-form' already exists.
Здесь все просто:
- либо используйте другое имя;
- либо сначала удалите или переименуйте существующую ветку.
Проверить наличие ветки:
git branch --list "feature/login-form"
# Покажет, есть ли такая ветка
Проблема 4. Переименование ветки main/master
Многие проекты переезжают с имени master на main. Если вы создаете ветки от неправильной «основной» ветки, история может запутаться.
Проверить текущую основную ветку:
git branch
# Смотрите, где звезда и какие есть ветки main/master
Если у вас локально другая основная ветка, чем на сервере, стоит синхронизировать их, но это уже отдельная тема. Главное — всегда явно понимать, от какой именно ветки вы создаете новые.
Заключение
Работа с ветками в Git строится вокруг нескольких ключевых идей:
- ветка — это указатель на коммит, а не копия файлов;
- git branch создает, удаляет, переименовывает и показывает ветки;
- git checkout и git switch используются для создания ветки с переключением и для перехода между ветками;
- важно осознанно выбирать базовую ветку перед созданием новой;
- удаление и переименование веток требует внимательности, особенно когда ветка уже есть на сервере.
Когда вы привыкаете к этим операциям, работа с ветками становится естественной частью процесса: каждая новая задача — новая ветка, независимая от других изменений, но легко сливаемая обратно в основную ветку.
Наберите небольшую практику: создайте несколько тестовых веток, переключайтесь, удаляйте, пробуйте разные команды git branch и git switch. После этого использование веток перестанет казаться чем-то сложным, а станет обычным удобным инструментом.
Частозадаваемые технические вопросы по теме и ответы
Как создать ветку от конкретного тега, а не от ветки
Если у вас есть тег, и вы хотите начать ветку именно от него:
git branch feature/from-v1 v1.0.0
# v1.0.0 - имя тега, feature/from-v1 - новая ветка
Потом переключитесь в нее:
git switch feature/from-v1
Как узнать, от какой ветки была создана текущая ветка
Явной «ссылки» нет, но можно посмотреть общие предки. Быстрый прием:
git merge-base main HEAD
# Показывает общий предок текущей ветки и main
Потом проверяете лог вокруг этого коммита в разных ветках и оцениваете, откуда начиналась работа. В командных процессах это обычно фиксируется в задаче (например, всегда от develop).
Как создать ветку только с частью изменений из текущей ветки
Один из вариантов:
- Закоммитьте изменения в текущей ветке (в один или несколько коммитов).
Создайте новую ветку от базовой:
git switch main git switch -c feature/partialПеренесите нужные коммиты:
git cherry-pick <hash1> <hash2> # Переносим только выбранные коммиты
Так вы получите ветку с частью изменений.
Как создать ветку, не затрагивая текущий рабочий каталог
Если вы хотите просто добавить ветку как указатель (например, для пометки коммита), не изменяя файлы:
git branch mark-before-refactor <commit>
# Создает ветку, но не переключает вас в нее
Рабочее дерево не изменится, так как вы остаетесь в текущей ветке.
Как увидеть, какие ветки уже слиты и их можно смело удалять
Используйте:
git branch --merged main
# Ветки, полностью слитые в main
Затем удаляйте ненужные:
git branch -d old-feature
# Удаляем только те ветки, которые есть в списке merged
Постройте личный план изучения Git до уровня Middle — бесплатно!
Git — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Git
Лучшие курсы по теме

Основы Git
Антон Ларичев
TypeScript с нуля
Антон Ларичев