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.
Синтаксис
Символ - означает «предыдущая ветка» — аналогично 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 — современная замена git checkout для работы с ветками. Используйте git switch для веток и git restore для восстановления файлов. Это разделение делает намерения кода более явными.
git switch feature/x, а такой локальной ветки нет, но есть origin/feature/x — Git автоматически создаст локальную ветку с отслеживанием. Это поведение управляется опцией --guess (включена по умолчанию).
--force отбрасывает все незафиксированные изменения в рабочем каталоге и индексе. В отличие от коммитов, эти изменения нельзя восстановить через reflog. Перед использованием убедитесь, что всё нужное зафиксировано или спрятано в stash.