git branches

git switch

Переключение между ветками (современная замена git checkout для веток)

Описание

git switch — команда, добавленная в Git 2.23 (август 2019) специально для переключения между ветками. До её появления для этого использовался git checkout, который выполнял сразу несколько разных задач (переключение веток, восстановление файлов, создание новых веток). git switch решает только одну задачу — переключение веток, что делает её более понятной и безопасной.

При переключении ветки Git обновляет рабочий каталог и индекс, чтобы они соответствовали состоянию целевой ветки. Если у вас есть незафиксированные изменения, Git попытается перенести их на новую ветку. Если это невозможно (конфликт), Git откажется переключаться и предложит либо сохранить изменения через git stash, либо зафиксировать их.

Используйте git switch как основную команду переключения веток в новых проектах. Для создания ветки с немедленным переключением — git switch -c. Для восстановления файлов (не веток) используйте git restore.

Синтаксис

# Переключиться на существующую ветку git switch <имя-ветки> # Создать новую ветку и переключиться git switch -c <имя-новой-ветки> git switch -c <имя-новой-ветки> <начальная-точка> # Создать ветку от удалённой (с отслеживанием) git switch -c <ветка> --track origin/<ветка> # Переключиться на предыдущую ветку git switch - # Принудительное переключение (отбросить изменения) git switch -f <имя-ветки> # Создать ветку без истории (orphan) git switch --orphan <имя-ветки>

Символ - означает «предыдущая ветка» — аналогично cd - в bash для возврата в предыдущий каталог.

Флаги и опции

Флаг Описание
-c, --create Создать новую ветку и сразу переключиться на неё
-C, --force-create Создать ветку принудительно (сбрасывает существующую ветку с таким именем)
-f, --force Принудительное переключение: отбрасывает незафиксированные изменения в рабочем каталоге и индексе
--discard-changes Синоним --force — явно указывает на отброс изменений
-t, --track При создании ветки настроить отслеживание указанной удалённой ветки
--no-track Не устанавливать upstream даже если branch.autoSetupMerge настроен
--orphan Создать ветку-сироту: новая ветка без истории (полезно для gh-pages, docs)
--guess Если ветка не найдена локально, попытаться создать её от remote-tracking ветки (включено по умолчанию)
--no-guess Не пытаться автоматически создавать ветку от remote
-m, --merge Выполнить трёхстороннее слияние при переключении с незафиксированными изменениями
- Переключиться на предыдущую ветку (аналог @{-1})

Паттерны использования

Стандартное переключение веток

# Переключиться на main
git switch main

# Вернуться на предыдущую ветку
git switch -

# Переключиться на feature-ветку
git switch feature/user-auth

Создание ветки и переключение

# Создать feature-ветку от текущей
git switch -c feature/new-dashboard

# Создать от конкретной точки
git switch -c hotfix/bug-99 main

# Создать от тега
git switch -c release/v2.0 v2.0.0-rc1

Работа с удалёнными ветками

# Создать ветку с отслеживанием remote
# (git guess делает это автоматически)
git switch feature/login

# Явное создание с tracking
git switch -c feature/login --track origin/feature/login

Переключение с незафиксированными изменениями

# Если есть конфликт — сначала stash
git stash
git switch other-branch
# ... работаем ...
git switch -
git stash pop

Ветка-сирота для GitHub Pages

# Создать gh-pages без истории проекта
git switch --orphan gh-pages

# Рабочий каталог пуст, создаём контент
echo "docs site" > index.html
git add index.html
git commit -m "init: github pages"

Принудительное переключение

# ОСТОРОЖНО: теряются незафиксированные изменения
git switch -f main

# Безопаснее: сначала проверить статус
git status
# если изменения не нужны:
git restore .
git switch main

Советы и подводные камни

git switch vs git checkout: git switch — современная замена git checkout для работы с ветками. Используйте git switch для веток и git restore для восстановления файлов. Это разделение делает намерения кода более явными.
Автоматическое создание от remote: если вы выполняете git switch feature/x, а такой локальной ветки нет, но есть origin/feature/x — Git автоматически создаст локальную ветку с отслеживанием. Это поведение управляется опцией --guess (включена по умолчанию).
-f удаляет несохранённые изменения безвозвратно: флаг --force отбрасывает все незафиксированные изменения в рабочем каталоге и индексе. В отличие от коммитов, эти изменения нельзя восстановить через reflog. Перед использованием убедитесь, что всё нужное зафиксировано или спрятано в stash.