Git
简体中文 ▾ Topics ▾ Latest version ▾ git-switch last updated in 2.44.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,否则该操作将被中止。

这个命令是试验性的。其行为可能会改变。

选项

<分支>

转到的分支。

<新分支>

新分支的名称。

<start-point>

新分支的起点。指定 <起始点> 后,就可以根据历史上的其他点创建分支,而不是 HEAD 当前指向的点。(或者,在 --detach 的情况下,允许你检查并从其他点分离。)

您可以使用 @{-N} 语法来指使用 "git switch" 或 "git checkout" 操作切换到的第 N 个分支或提交。您也可以指定与 @{-1} 同义的 -。 这通常用于在两个分支之间快速切换,或撤销错误的分支切换。

作为一种特殊情况,如果正好有一个合并基础,你可以使用`A…​B`作为`A`和`B`的合并基础的快捷方式。你最多可以省略在`A`和`B`中默认为`HEAD`的一个分支。

-c <新分支>
--create <新分支>

在切换到分支之前,从 <起点> 开始创建一个名为 <新分支> 的新分支。这相当于

$ git branch <新分支>
$ git switch <新分支>

也就是说,除非 "git switch" 成功,否则不会重置/创建分支(例如,当分支在另一个工作树中使用时,不仅当前分支保持不变,分支也不会重置为起点)。

-C <新分支>
--force-create <新分支>

类似于 --create,但如果 <新分支> 已经存在,它将被重置为 <起点>。这是一个方便的快捷方式:

$ git branch -f <新分支>
$ git switch <新分支>
-d
--detach

切换到用于检查和可丢弃实验的提交。详见 git-checkout[1] 中的 “分离式 HEAD” 部分。

--guess
--no-guess

如果没有找到`<分支>,但确实有一个远程分支(称为<远程分支>`)的跟踪分支存在,且名称匹配,则视为等同于

$ git switch -c <分支> --track <远程仓库>/<分支>

如果该分支存在于多个远程,并且其中一个是由`checkout.defaultRemote`配置变量命名的,为了消除歧义,我们将使用该变量,即使`<分支>在所有远程中并不唯一。将其设置为例如 `checkout.defaultRemote=origin,以便在`<分支>不明确但存在于'origin'远程时,总是从那里签出远程分支。参见 git-config[1] 中的 `checkout.defaultRemote

--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"(除了 "merge" 样式显示的内容外,还显示原始内容)。

-q
--quiet

静默,压制反馈信息。

--progress
--no-progress

当它附加到终端时,除非指定 --quiet,否则默认情况下会在标准错误流中报告进度状态。这个标志可以启用进度报告,即使没有附在到终端,而不管 --quiet

-t
--track [direct|inherit]

创建新分支时,请设置 "upstream"(上游仓库)配置。 选项 -c 是隐含的。详见 git-branch[1] 中的 --track

如果没有给定 -c 选项,新分支的名称将从远程跟踪分支中导出,方法是查看为相应远程配置的引用规范的本地部分,然后去掉首部至 "*" 的部分。 这将告诉我们,在从 origin/hack (或 remotes/origin/hack,甚至 refs/remotes/origin/hack)分支时,使用 hack 作为本地分支。 如果给定的名称中没有斜线,或者上述猜测的结果是空名,猜测就会中止。 在这种情况下,可以用 -c 明确地给出一个名称。

--no-track

不设置 "上游 "配置,即使`branch.autoSetupMerge`配置变量为true。

--orphan <新分支>

创建一个新的 unborn (未出生)分支,命名为 <新分支>。所有被跟踪的文件都会被删除。

--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 mytopic

但是,您的 "wrong" 分支和正确的 "mytopic" 分支可能在您本地修改的文件中存在差异,在这种情况下,上述开关就会像这样失败:

$ git switch mytopic
error: 你对 'footz' 进行了本地更改,而不是切换分支。

你可以给命令加上 `-m`标志,这样就可以尝试三方合并了:

$ git switch -m mytopic
自动合并 frotz 中

在这个三方合并之后,本地的修改并「没有」登记在你的索引文件中,所以`git diff`会显示你在新分支的提示下做了哪些修改。

切换回切换到 mytopic 之前的分支(即 "master" 分支):

$ git switch -

你可以从任何提交创建一个新分支。例如,切换到 "HEAD~3" 并创建分支 "fixup":

$ git switch -c fixup HEAD~3
切换到新分支 'fixup'

如果要从同名的远程分支启动一个新分支:

$ git switch new-topic
设置了分支 'new-topic',以跟踪来自 'origin' 的远程分支 'new-topic'
切换到一个新分支 'new-topic'

查看提交 HEAD~3 以进行临时检查或实验,而无需创建新分支:

$ git switch --detach HEAD~3
HEAD 现为 9fc9555312 合并分支 'cc/shared-index-permbits'

如果发现你所做的任何事情都值得保留,你可以随时为它创建一个新名称(不需要换掉):

$ git switch -c good-surprises

配置

Warning

Missing zh_HANS-CN/includes/cmd-config-section-all.txt

See original version for this content.

Warning

Missing zh_HANS-CN/config/checkout.txt

See original version for this content.

GIT

属于 git[1] 文档

scroll-to-top