git switch
Команда git switch: современный способ переключать и создавать ветки. Отличия от git checkout и примеры использования.
Определение
Команда git switch меняет ветку, над которой вы работаете. Появившись в Git 2.23, она была выделена из перегруженной команды git checkout, чтобы выполнять одну задачу чётко: перемещать HEAD на другую ветку и обновлять рабочее дерево в соответствии с ней. Всё, что связано с восстановлением файлов, теперь находится в git restore, поэтому switch сосредоточена исключительно на ветках.
На этой странице описано: переключение на существующую ветку, создание ветки «на лету», получение удалённой ветки, перенос незафиксированных изменений, возврат с помощью -, а также отличия git switch от git checkout.
Зачем появилась git switch
Годами git checkout решала две несвязанные задачи: переключение веток и восстановление файлов в рабочем дереве. Такая перегруженность легко приводила к случайной потере работы — git checkout <file> молча отбрасывала изменения, тогда как git checkout <branch> переносила вас на новое место. Git 2.23 разделил ответственность, чтобы каждая команда была предсказуемой: git switch перемещает между ветками, а git restore восстанавливает файлы. Оба инструмента появились одновременно именно по этой причине. git checkout не устарела и по-прежнему работает, но для повседневной работы с ветками git switch понятнее и безопаснее.
Переключение на существующую ветку
Чтобы перейти на уже существующую ветку, укажите её имя:
git switch featureHEAD теперь указывает на feature, а рабочий каталог отражает последний коммит этой ветки. Если незафиксированные изменения были бы перезаписаны, Git остановится и предупредит вас, не уничтожая работу.
Создание ветки и переключение за один шаг
Используйте флаг -c (create), чтобы создать новую ветку и сразу перейти на неё:
git switch -c new-featureЭто современный эквивалент git checkout -b new-feature. Можно также базировать новую ветку на конкретной отправной точке:
git switch -c hotfix mainЗдесь main — это начальная точка: новая ветка hotfix начинается с того же коммита, что и main, после чего они расходятся независимо. Начальной точкой может быть имя ветки, тег или хеш коммита.
Получение удалённой ветки
Весьма распространённый случай — начать работу над веткой, которая существует на удалённом репозитории, но ещё не создана локально, например после того, как коллега отправил ветку feature. Если имя однозначно, просто переключитесь на неё:
git fetch
git switch featureGit увидит, что локальной ветки feature нет, найдёт единственную origin/feature и автоматически создаст локальную feature, отслеживающую её. Такое удобное поведение называется --guess и включено по умолчанию. Чтобы указать явно или если несколько удалённых репозиториев содержат ветку с одинаковым именем, задайте отслеживаемую ветку самостоятельно:
git switch -c feature --track origin/featureСначала выполните git fetch. git switch может найти только те удалённые ветки, о которых уже знает локальный репозиторий; fetch обновляет этот список.
Перенос незафиксированных изменений на другую ветку
По умолчанию переключение с незафиксированными изменениями допустимо при условии, что эти изменения не конфликтуют с целевой веткой — Git сохраняет их в рабочем дереве. Если они будут перезаписаны, Git откажет и сообщит об этом. Чтобы намеренно перенести конфликтующие локальные изменения и смёрджить их в новую ветку, добавьте флаг -m (--merge):
git switch -m other-branchЕсли предпочитаете отложить изменения и применить их позже, воспользуйтесь git stash вместо принудительного переключения.
Основные параметры
| Команда | Описание |
|---|---|
git switch <branch> | Переключается на существующую ветку. |
git switch -c <branch> | Создаёт новую ветку и переключается на неё. |
git switch -c <branch> <start-point> | Создаёт ветку из указанного коммита или ветки и переключается на неё. |
git switch - | Переключается обратно на предыдущую ветку. |
git switch -c <branch> --track <remote>/<branch> | Создаёт локальную отслеживающую ветку из удалённой ветки. |
git switch --detach <commit> | Переходит на коммит напрямую в состоянии detached HEAD. |
git switch -m <branch> | Переключается, смёрджив конфликтующие локальные изменения в целевую ветку. |
git switch -C <branch> | Создаёт ветку или сбрасывает её, если она уже существует, затем переключается. |
git switch --orphan <branch> | Начинает новую ветку без истории и с пустым рабочим деревом. |
Возврат к предыдущей ветке
Одно тире возвращает вас на ветку, на которой вы были раньше:
git switch -Это удобно, когда вы переключаетесь между двумя ветками и не хотите каждый раз вводить их имена.
Просмотр коммита без привязки к ветке
Чтобы заглянуть в старый коммит, не перемещая никакую ветку, используйте --detach. Это переводит вас в состояние detached HEAD — HEAD указывает непосредственно на коммит, а не на имя ветки:
git switch --detach 8f4c2a1Вы можете просматривать и даже собирать проект отсюда, но новые коммиты не привязаны к ветке и могут быть потеряны после переключения. Если вы решите сохранить их, сначала создайте ветку с помощью git switch -c <name>.
git switch против git checkout
Обе команды могут менять ветку — зачем тогда предпочитать switch? Потому что она не может случайно затронуть ваши файлы. git checkout принимает как имена веток, так и пути к файлам, что означает: опечатка может молча перезаписать вашу работу. git switch работает исключительно с ветками; чтобы отменить изменения в файле, вы обращаетесь к явно названной команде git restore.
# Old, overloaded way
git checkout main
git checkout -b feature
# Modern, explicit way
git switch main
git switch -c featureОбратите внимание: одна вещь, которую git checkout умеет, а git switch — нет, это работа с файлами (git checkout -- file.txt). Это сделано намеренно: файловые операции теперь принадлежат git restore.
Связанные команды
- git checkout — старая многоцелевая команда, которую заменили
switchиrestore. - git restore — отмена или восстановление изменений файлов в рабочем дереве.
- git branch — просмотр, создание, переименование и удаление веток.
- git merge — объединение работы из другой ветки после возвращения на нужную.
- git stash — откладывание незафиксированных изменений перед переключением.