↓Перейти к содержанию
  1. Git: руководства и команды/

Как посмотреть текущую ветку в Git: простые методы

·7 минут·

Знать, в какой ветке вы находитесь — базовая необходимость при работе с Git. Особенно важно перед коммитом или merge, чтобы случайно не испортить не ту ветку. Вот несколько способов это проверить.

Основной способ: git status #

git status

В первой строке всегда указана текущая ветка:

On branch main
nothing to commit, working tree clean

Или при наличии изменений:

On branch feature/auth
Changes not staged for commit:
  ...

Специализированная команда: git branch –show-current #

Выводит только имя текущей ветки — ничего лишнего:

git branch --show-current
# main

Удобно для скриптов и в команде с другими утилитами:

echo "Current branch: $(git branch --show-current)"

Команда git branch #

git branch

Показывает все локальные ветки. Текущая отмечена звёздочкой *:

* feature/auth
  main
  develop

Альтернативные команды #

# Через rev-parse
git rev-parse --abbrev-ref HEAD
# main

# Через symbolic-ref
git symbolic-ref --short HEAD
# main

Обе команды выводят имя ветки. rev-parse --abbrev-ref возвращает HEAD если вы в detached HEAD режиме.

Что такое detached HEAD #

Если вы сделали git checkout <hash> или git checkout <tag>, вы попадаете в режим detached HEAD:

git status
# HEAD detached at a1b2c3d

git branch --show-current
# (пустой вывод)

git rev-parse --abbrev-ref HEAD
# HEAD

В этом режиме HEAD указывает прямо на коммит, а не на ветку. Коммиты можно делать, но они «потеряются» при переключении на другую ветку. Чтобы выйти из detached HEAD:

git switch main
# или создать ветку из этого состояния
git switch -c new-branch-name

Отображение ветки в командной строке #

Удобнее всего видеть текущую ветку прямо в prompt (приглашении командной строки).

Bash (добавить в ~/.bashrc):

parse_git_branch() {
  git branch --show-current 2>/dev/null
}
export PS1="\u@\h \w \[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Zsh (добавить в ~/.zshrc):

autoload -Uz vcs_info
precmd() { vcs_info }
zstyle ':vcs_info:git:*' formats '%b'
setopt PROMPT_SUBST
PROMPT='%n@%m %~ ${vcs_info_msg_0_} $ '

Современное решение — Starship: Красивый кросс-платформенный prompt для bash, zsh, fish, PowerShell. Автоматически показывает ветку Git и многое другое.

# Установка Starship
curl -sS https://starship.rs/install.sh | sh

# Добавить в ~/.bashrc или ~/.zshrc
eval "$(starship init bash)"
# или
eval "$(starship init zsh)"

Просмотр всех веток и их состояния #

# Все локальные ветки с последним коммитом
git branch -v
# * main    a1b2c3d Последний коммит main
#   feature b4c5d6e Последний коммит feature

# С информацией об отслеживаемой удалённой ветке
git branch -vv
# * main    a1b2c3d [origin/main] Последний коммит
#   feature b4c5d6e [origin/feature: ahead 2] 2 коммита впереди сервера

# Все ветки (локальные и удалённые)
git branch -a

# Только удалённые ветки
git branch -r

Проверка текущей ветки в скриптах #

Часто нужно проверить текущую ветку в bash-скриптах:

# Получить имя текущей ветки
current_branch=$(git branch --show-current)

# Проверить что находимся в нужной ветке
if [ "$current_branch" = "main" ]; then
  echo "You are in main branch"
else
  echo "You are in $current_branch branch"
fi

# Запретить коммиты в main (защита от ошибок)
if [ "$current_branch" = "main" ]; then
  echo "Error: Cannot commit directly to main"
  exit 1
fi

# Проверить находимся ли в git-репо
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
  echo "Not in a git repository"
  exit 1
fi

Переменные окружения CI/CD #

В CI/CD системах (GitHub Actions, GitLab CI, Jenkins) текущая ветка передаётся через переменные окружения:

# GitHub Actions
echo $GITHUB_REF       # refs/heads/main или refs/heads/feature/auth
echo $GITHUB_HEAD_REF  # feature/auth (для pull request)

# GitLab CI
echo $CI_COMMIT_BRANCH  # main или feature/auth

# Jenkins
echo $GIT_BRANCH       # origin/main
echo $BRANCH_NAME      # main (без origin/)

# Как использовать в скриптах
if [ "$CI_COMMIT_BRANCH" = "main" ]; then
  echo "Running on main branch"
fi

Показание текущей ветки в IDE #

VS Code: Автоматически показывает в статус-баре внизу слева. Клик на ветку позволяет переключиться.

IntelliJ IDEA / PyCharm: В правом нижнем углу. Клик позволяет переключиться и создать новую ветку.

Sublime Text: Требует плагина SublimeGit или GitSavvy. Команда через Command Palette: “Git: Show Status”.

Vim: Требует плагина (vim-gitbranch) или конфигурации statusline:

set statusline+=%{FugitiveStatusline()}

Detached HEAD: что это и как исправить #

Detached HEAD — состояние когда HEAD указывает на конкретный коммит, а не на ветку:

# Как попасть в detached HEAD
git checkout abc1234        # переход на конкретный коммит
git checkout v1.0.0         # переход на тег

# Признаки detached HEAD
git status
# HEAD detached at abc1234

git branch --show-current
# (ничего не выводит)

git rev-parse --abbrev-ref HEAD
# HEAD

# Почему это проблема:
# - Коммиты которые вы делаете потеряются при переключении на ветку
# - Нет точки отсчета для синхронизации

# Как исправить: создать ветку из текущего состояния
git switch -c my-new-branch
# или старый синтаксис
git checkout -b my-new-branch

# Теперь вы на новой ветке со всеми коммитами

Проверить находитесь ли вы в detached HEAD #

# Проверка в bash-скрипте
if [ "$(git rev-parse --abbrev-ref HEAD)" = "HEAD" ]; then
  echo "You are in detached HEAD state"
  exit 1
fi

Практические примеры #

# Основной способ
git status

# Только имя ветки
git branch --show-current

# Список веток со звёздочкой у текущей
git branch

# Через rev-parse (для скриптов)
git rev-parse --abbrev-ref HEAD

# Проверить, находимся ли в git-репозитории
git rev-parse --is-inside-work-tree

# Показать текущую ветку в одну строку
git log -1 --oneline

# Все ветки с подробностями
git branch -vv

Часто задаваемые вопросы #

Почему важно знать текущую ветку? Все операции (коммиты, merge, rebase, push) происходят в текущей ветке. Если вы ошиблись веткой — можно случайно испортить main или удалить важную ветку. Всегда проверяйте перед опасными операциями.

Как настроить отображение ветки в приглашении команд? Самый простой способ — установить Starship (starship.rs), он работает на bash, zsh, PowerShell и автоматически показывает ветку Git. Или вручную добавьте в .bashrc / .zshrc функцию которая выводит ветку в PS1.

Что означает detached HEAD? Это состояние когда HEAD указывает прямо на коммит, а не на ветку. Обычно возникает после git checkout <hash> или git checkout <tag>. Коммиты в этом состоянии не привязаны к ветке и потеряются при переключении. Создайте ветку: git switch -c имя-ветки.

Как узнать отслеживает ли моя ветка удалённую? git branch -vv покажет в квадратных скобках имя отслеживаемой удалённой ветки. Пример: [origin/main] означает что ветка отслеживает origin/main.

Как установить отслеживание удалённой ветки? git branch --set-upstream-to=origin/feature-name или современный синтаксис: git branch --track feature-name origin/feature-name. Это позволит использовать git push и git pull без указания удалённой ветки.

Почему git status показывает разное в разных IDE? IDE могут использовать свои интерпретации и визуализации. Но под капотом все используют одни и те же команды Git. Всегда можно верить выводу git status в командной строке.

Как узнать на какой ветке я был раньше? git reflog показывает историю переключений веток и операций. Для быстрого возврата: git checkout - но это работает только если вы переключились один раз.

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

# Обновить локальную информацию о удалённых ветках
git fetch origin

# Теперь можно проверить статус
git status
# On branch main
# Your branch is behind 'origin/main' by 2 commits

# Если локальная ветка отстаёт — сделать pull
git pull origin

# Если локальная ветка впереди
# Your branch is ahead of 'origin/main' by 1 commit
# Нужно сделать push
git push origin

Отслеживание удалённых веток #

# Создать локальную ветку отслеживающую удалённую
git checkout --track origin/feature-name

# Или установить отслеживание для существующей ветки
git branch --set-upstream-to=origin/main main

# Проверить отслеживаемые удалённые ветки
git branch -vv

Сравнение веток #

# Какие коммиты в main которых нет в feature
git log feature..main --oneline

# Какие коммиты в feature которых нет в main
git log main..feature --oneline

# Коммиты в обе стороны (разница)
git log main...feature --oneline

# Какие файлы различаются между ветками
git diff --name-only main feature

# Подробное сравнение изменений
git diff main feature

Автоматическое переключение при push #

# Если хотите автоматически создать локальную ветку на основе удалённой
git push -u origin my-feature

# Флаг -u (--set-upstream) создаст отслеживание
# Теперь pull/push будут работать без указания remote

# После первого push -u, просто:
git push
git pull
# Работает без указания origin и имени ветки

Защита от случайного коммита в main #

# Создать git hook которая защитит от коммита в main
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" = "main" ] || [ "$current_branch" = "master" ]; then
  echo "Error: Cannot commit directly to $current_branch branch"
  exit 1
fi
EOF

chmod +x .git/hooks/pre-commit

Переименование текущей ветки #

# Переименовать текущую ветку локально
git branch -m new-branch-name

# Если переименовали и запушили старую ветку на удаленно
# Нужно удалить старую и создать новую на сервере
git push origin --delete old-branch-name
git push -u origin new-branch-name

Заключение #

Самый простой способ узнать текущую ветку — git status (показывает всю ситуацию) или git branch --show-current (только имя ветки). Настройте отображение ветки в prompt командной строки с помощью Starship или вручную через .bashrc — это сильно упростит ежедневную работу и предотвратит ошибки.

Подробнее о работе с ветками: создание веток, переключение между ветками, удалённые ветки.