Как посмотреть текущую ветку в Git: простые методы
Знать, в какой ветке вы находитесь — базовая необходимость при работе с 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 — это сильно упростит ежедневную работу и предотвратит ошибки.
Подробнее о работе с ветками: создание веток, переключение между ветками, удалённые ветки.