Создание ветки в Git - git branch

17 декабря 2025
Автор

Олег Марков

Введение

Ветки в 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
# Переименовываем ветку с указанием старого и нового имени

Синхронизация переименованной ветки с удаленным репозиторием

Если ветка уже была запушена на сервер, после переименования локально нужно:

  1. Удалить старую удаленную ветку:

    git push origin --delete old-name
    # Удаляем старую ветку на сервере
    
  2. Запушить новую ветку и установить отслеживание:

    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 или локально) можно:

  1. Переключиться в основную ветку и обновиться:

    git switch main
    git pull
    
  2. Удалить локальную ветку:

    git branch -d feature/1234-user-profile
    # Безопасное удаление локальной ветки
    
  3. Удалить ветку на сервере (если это нужно по процессу):

    git push origin --delete feature/1234-user-profile
    

Такой цикл повторяется для каждой задачи.

Типичные проблемы и ошибки при создании веток

Проблема 1. Ветка создана не от той базовой ветки

Ситуация: вы думали, что стоите в main, а на самом деле были в develop. В итоге новая ветка включает лишние коммиты.

Как это заметить:

  • git log показывает коммиты, которых не должно быть;
  • при создании pull request появилось слишком много изменений.

Как исправить:

  1. Убедитесь, от какой ветки вы хотели начать (например, main).

  2. Посмотрите, какой коммит в main должен быть базовым:

    git switch main
    git log --oneline -5
    # Находим нужный базовый коммит
    
  3. Переключитесь в «неправильно» созданную ветку:

    git switch feature/wrong-base
    
  4. Пересоздайте ветку правильно (один из вариантов — через новую ветку и cherry-pick):

    • создайте новую ветку от правильной базовой:

      git switch main
      git switch -c feature/correct-base
      
    • перенесите нужные коммиты через cherry-pick или заново внесите изменения.

  5. Старую ветку можно удалить после переноса изменений.

Проблема 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.

Это значит, что:

  • в текущей ветке есть незакоммиченные изменения в файле;
  • в целевой ветке этот файл отличается;
  • если переключиться, изменения потеряются.

Варианты решения:

  1. Закоммитить изменения:

    git add src/app.go
    git commit -m "WIP changes to app.go"
    git switch other-branch
    
  2. Временно отложить изменения:

    git stash
    # Сохраняем текущие изменения во временное хранилище
    
    git switch other-branch
    # Теперь переключение возможно
    
  3. Откатить изменения, если они не нужны:

    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).

Как создать ветку только с частью изменений из текущей ветки

Один из вариантов:

  1. Закоммитьте изменения в текущей ветке (в один или несколько коммитов).
  2. Создайте новую ветку от базовой:

    git switch main
    git switch -c feature/partial
    
  3. Перенесите нужные коммиты:

    git cherry-pick <hash1> <hash2>
    # Переносим только выбранные коммиты
    

Так вы получите ветку с частью изменений.

Как создать ветку, не затрагивая текущий рабочий каталог

Если вы хотите просто добавить ветку как указатель (например, для пометки коммита), не изменяя файлы:

git branch mark-before-refactor <commit>
# Создает ветку, но не переключает вас в нее

Рабочее дерево не изменится, так как вы остаетесь в текущей ветке.

Как увидеть, какие ветки уже слиты и их можно смело удалять

Используйте:

git branch --merged main
# Ветки, полностью слитые в main

Затем удаляйте ненужные:

git branch -d old-feature
# Удаляем только те ветки, которые есть в списке merged
Стрелочка влевоПросмотр веток в Git с помощью git branch -a

Постройте личный план изучения Git до уровня Middle — бесплатно!

Git — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Git

Открыть базу знаний

Лучшие курсы по теме

изображение курса

Основы Git

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий