Русский ▾ Topics ▾ Latest version ▾ git-switch last updated in 2.51.0

НАЗВАНИЕ

git-switch — переключение веток

ОБЗОР

git switch [<параметры>] [--no-guess] <ветка>
git switch [<параметры>] --detach [<начальная-точка>]
git switch [<параметры>] (-c|-C) <новая-ветка> [<начальная-точка>]
git switch [<параметры>] --orphan <новая-ветка>

ОПИСАНИЕ

Переключиться на указанную ветку. Рабочий каталог и индекс обновляются в соответствии с веткой. Все новые коммиты будут добавлены к верхушке этой ветки.

При необходимости можно создать новую ветку с помощью -c, -C, автоматически из внешней ветки с тем же именем (см. --guess) или отсоединить рабочий каталог от любой ветки с помощью --detach вместе с переключением.

Переключение веток не требует чистого индекса и рабочего каталога (т.е. отсутствия различий по сравнению с HEAD). Однако операция прерывается, если она приводит к потере локальных изменений, если не указано иное с помощью --discard-changes или --merge.

ПАРАМЕТРЫ

<ветка>

Ветка, на которую нужно переключиться.

<новая-ветка>

Имя для новой ветки.

<начальная-точка>

Начальная точка для новой ветки. Указание <начальной-точки> позволяет вам создать ветку на основе какой-либо другой точки в истории, отличной от той, на которую в данный момент указывает HEAD. (Или, в случае --detach, позволяет вам осмотреть и отсоединиться от какой-либо другой точки.)

Вы можете использовать синтаксис @{-<N>}, чтобы ссылаться на <N>-ю последнюю ветку/коммит, на который было выполнено переключение с помощью операции git switch или git checkout. Вы также можете указать -, что является синонимом @{-1}. Это часто используется для быстрого переключения между двумя ветками или для отмены ошибочного переключения ветки.

В качестве особого случая вы можете использовать <rev-a>...<rev-b> как сокращение для базы слияния <rev-a> и <rev-b>, если существует ровно одна база слияния. Вы можете опустить не более одного из <rev-a> и <rev-b>, и в этом случае по умолчанию используется HEAD.

-c <новая-ветка>
--create <новая-ветка>

Создать новую ветку с именем <новая-ветка>, начинающуюся с <начальной-точки>, перед переключением на ветку. Это транзакционный эквивалент

$ git branch <новая-ветка>
$ git switch <новая-ветка>

то есть ветка не сбрасывается/не создаётся, если git switch не завершится успешно (например, когда ветка используется в другом рабочем каталоге, не только текущая ветка остаётся прежней, но и ветка не сбрасывается на начальную точку).

-C <новая-ветка>
--force-create <новая-ветка>

Аналогично --create, за исключением того, что если <новая-ветка> уже существует, она будет сброшена на <начальную-точку>. Это удобный ярлык для:

$ git branch -f _<новая-ветка>_
$ git switch _<новая-ветка>_
-d
--detach

Переключиться на коммит для осмотра и одноразовых экспериментов. Подробности см. в разделе "ОТСОЕДИНЁННЫЙ HEAD" в git-checkout[1].

--guess
--no-guess

Если <ветка> не найдена, но существует отслеживаемая внешняя ветка ровно в одном внешнем репозитории (назовём его <внешний-репозиторий>) с совпадающим именем, обрабатывать как эквивалент

$ git switch -c <ветка> --track <внешний-репозиторий>/<ветка>

Если ветка существует в нескольких внешних репозиториях и один из них назван переменной конфигурации checkout.defaultRemote, мы будем использовать этот для устранения неоднозначности, даже если <ветка> не уникальна для всех внешних репозиториев. Установите её, например, checkout.defaultRemote=origin, чтобы всегда переключаться на внешние ветки оттуда, если <ветка> неоднозначна, но существует во внешнем репозитории origin. См. также checkout.defaultRemote в git-config[1].

--guess — это поведение по умолчанию. Используйте --no-guess, чтобы отключить его.

Поведение по умолчанию можно задать с помощью переменной конфигурации checkout.guess.

-f
--force

Псевдоним для --discard-changes.

--discard-changes

Продолжить, даже если индекс или рабочий каталог отличаются от HEAD. И индекс, и рабочий каталог восстанавливаются в соответствии с целевым объектом переключения. Если указан --recurse-submodules, содержимое подмодулей также восстанавливается в соответствии с целевым объектом переключения. Это используется для отмены локальных изменений.

-m
--merge

Если у вас есть локальные изменения в одном или нескольких файлах, которые различаются между текущей веткой и веткой, на которую вы переключаетесь, команда отказывается переключать ветки, чтобы сохранить ваши изменения в контексте. Однако с этим параметром выполняется трёхходовое слияние между текущей веткой, содержимым вашего рабочего каталога и новой веткой, и вы окажетесь на новой ветке.

Когда возникает конфликт слияния, записи индекса для конфликтующих путей остаются не слитыми, и вам нужно разрешить конфликты и пометить разрешённые пути с помощью git add (или git rm, если слияние должно привести к удалению пути).

--conflict=<стиль>

То же, что и параметр --merge выше, но изменяет способ представления конфликтующих блоков, переопределяя переменную конфигурации merge.conflictStyle. Возможные значения: merge (по умолчанию), diff3 и zdiff3.

-q
--quiet

Тихий режим, подавлять информационные сообщения.

--progress
--no-progress

Ход выполнения по умолчанию выводится в стандартный поток ошибок, если он подключён к терминалу, если не указан --quiet. Этот флаг включает вывод хода выполнения, даже если он не подключён к терминалу, независимо от --quiet.

-t
--track[ (direct|inherit)]

При создании новой ветки настраивает конфигурацию "вышестоящей". Подразумевается -c. Подробности см. в описании --track в git-branch[1].

Если параметр -c не указан, имя новой ветки будет получено из отслеживаемой внешней ветки путём просмотра локальной части спецификатора ссылки, настроенного для соответствующего внешнего репозитория, а затем удаления начальной части до "*". Это указывает нам использовать hack в качестве локальной ветки при создании ветки от origin/hack (или remotes/origin/hack, или даже refs/remotes/origin/hack). Если указанное имя не содержит слэша или приведённое выше угадывание даёт пустое имя, угадывание прерывается. В таком случае вы можете явно указать имя с помощью -c.

--no-track

Не настраивать конфигурацию "вышестоящей", даже если переменная конфигурации branch.autoSetupMerge имеет значение true.

--orphan <новая-ветка>

Создать новую нерождённую ветку с именем <новая-ветка>. Все отслеживаемые файлы удаляются.

--ignore-other-worktrees

git switch отказывается, когда нужная ссылка уже переключена другим рабочим каталогом. Этот параметр заставляет его всё равно переключить ссылку. Другими словами, ссылка может находиться в нескольких рабочих каталогах.

--recurse-submodules
--no-recurse-submodules

Использование --recurse-submodules обновит содержимое всех активных подмодулей в соответствии с коммитом, записанным в суперпроекте. Если ничего (или --no-recurse-submodules) не используется, рабочие каталоги подмодулей не будут обновлены. Как и git-submodule[1], это отсоединит HEAD подмодулей.

ПРИМЕРЫ

Следующая команда переключается на ветку "master":

$ git switch master

После работы в неправильной ветке переключение на правильную ветку выполняется с помощью:

$ git switch моя-тема

Однако ваша "неправильная" ветка и правильная ветка "моя-тема" могут различаться в файлах, которые вы изменили локально, и в этом случае приведённое выше переключение завершится ошибкой, например:

$ git switch моя-тема
ошибка: У вас есть локальные изменения в 'frotz'; переключение веток не выполняется.

Вы можете передать команде флаг -m, который попытается выполнить трёхходовое слияние:

$ git switch -m моя-тема
Автослияние frotz

После этого трёхходового слияния локальные изменения не регистрируются в вашем файле индекса, поэтому git diff покажет вам, какие изменения вы сделали с момента верхушки новой ветки.

Чтобы вернуться к предыдущей ветке, на которой мы были до переключения на моя-тема (т.е. ветка "master"):

$ git switch -

Вы можете создать новую ветку из любого коммита. Например, переключитесь на "HEAD~3" и создайте ветку "fixup":

$ git switch -c исправление HEAD~3
Переключено на новую ветку 'исправление'

Если вы хотите создать новую ветку из внешней ветки с тем же именем:

$ git switch новая-тема
Ветка `новая-тема` настроена на отслеживание внешней ветки `новая-тема` из `origin`
Переключено на новую ветку `новая-тема`

Чтобы переключиться на коммит HEAD~3 для временного осмотра или эксперимента без создания новой ветки:

$ git switch --detach HEAD~3
HEAD сейчас указывает на 9fc9555312 Слияние ветки 'cc/shared-index-permbits'

Если окажется, что всё, что вы сделали, стоит сохранить, вы всегда можете создать для этого новое имя (без переключения):

$ git switch -c хорошие-сюрпризы

КОНФИГУРАЦИЯ

Дальнейшее содержание этого раздела, повторяет то, что может быть найдено в git-config[1]:

checkout.defaultRemote

Когда вы запускаете git checkout <что-то> или git switch <что-то> и у вас есть только один внешний репозиторий, он может неявно переключиться на отслеживание, например, origin/<что-то>. Это перестаёт работать, как только у вас появляется более одного внешнего репозитория со ссылкой <что-то>. Этот параметр позволяет задать имя предпочтительного внешнего репозитория, который всегда должен побеждать при разрешении неоднозначности. Типичный вариант использования — установить это значение в origin.

В настоящее время это используется git-switch[1] и git-checkout[1], когда git checkout <что-то> или git switch <что-то> будет переключаться на ветку <что-то> в другом внешнем репозитории, и git-worktree[1], когда git worktree add ссылается на внешнюю ветку. Этот параметр может использоваться для других команд или функций, подобных переключению (checkout), в будущем.

checkout.guess

Предоставляет значение по умолчанию для опции --guess или --no-guess в git checkout и git switch. См. git-switch[1] и git-checkout[1].

checkout.workers

Количество параллельных рабочих процессов, используемых при обновлении рабочего каталога. По умолчанию — один, т.е. последовательное выполнение. Если установлено значение меньше единицы, Git будет использовать столько рабочих процессов, сколько доступно логических ядер. Этот параметр и checkout.thresholdForParallelism влияют на все команды, выполняющие переключение (checkout). Например, checkout, clone, reset, sparse-checkout и т.д.

Note
Параллельное переключение обычно обеспечивает лучшую производительность для репозиториев, расположенных на SSD или через NFS. Для репозиториев на вращающихся дисках и/или машинах с небольшим количеством ядер, последовательное переключение по умолчанию часто работает лучше. Размер и уровень сжатия репозитория также могут влиять на то, насколько хорошо работает параллельная версия.
checkout.thresholdForParallelism

При выполнении параллельного переключения с небольшим количеством файлов затраты на порождение подпроцессов и межпроцессное взаимодействие могут перевесить выигрыш от распараллеливания. Этот параметр позволяет вам определить минимальное количество файлов, для которых следует пытаться выполнить параллельное переключение. По умолчанию 100.

СМ. ТАКЖЕ

GIT

Является частью пакета git[1]