W3docs

git switch

Команда git switch: современный способ переключать и создавать ветки. Отличия от git checkout и примеры использования.

Определение

Команда git switch меняет ветку, над которой вы работаете. Появившись в Git 2.23, она была выделена из перегруженной команды git checkout, чтобы выполнять одну задачу чётко: перемещать HEAD на другую ветку и обновлять рабочее дерево в соответствии с ней. Всё, что связано с восстановлением файлов, теперь находится в git restore, поэтому switch сосредоточена исключительно на ветках.

На этой странице описано: переключение на существующую ветку, создание ветки «на лету», получение удалённой ветки, перенос незафиксированных изменений, возврат с помощью -, а также отличия git switch от git checkout.

git switch перемещает HEAD с одной ветки на другую

Зачем появилась git switch

Годами git checkout решала две несвязанные задачи: переключение веток и восстановление файлов в рабочем дереве. Такая перегруженность легко приводила к случайной потере работы — git checkout <file> молча отбрасывала изменения, тогда как git checkout <branch> переносила вас на новое место. Git 2.23 разделил ответственность, чтобы каждая команда была предсказуемой: git switch перемещает между ветками, а git restore восстанавливает файлы. Оба инструмента появились одновременно именно по этой причине. git checkout не устарела и по-прежнему работает, но для повседневной работы с ветками git switch понятнее и безопаснее.

Переключение на существующую ветку

Чтобы перейти на уже существующую ветку, укажите её имя:

git switch feature

HEAD теперь указывает на 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 feature

Git увидит, что локальной ветки 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 HEADHEAD указывает непосредственно на коммит, а не на имя ветки:

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 — откладывание незафиксированных изменений перед переключением.

Практика

Практика
Какие утверждения о 'git switch' верны?
Какие утверждения о 'git switch' верны?
Was this page helpful?