Git
英文 ▾ 主题 ▾ 最新版本 ▾ git-switch 最后更新于 2.44.0

名称

git-switch - 切换分支

概要

git switch [<options>] [--no-guess] <branch>
git switch [<options>] --detach [<start-point>]
git switch [<options>] (-c|-C) <new-branch> [<start-point>]
git switch [<options>] --orphan <new-branch>

描述

切换到指定的分支。工作树和索引会更新以匹配该分支。所有新的提交将添加到该分支的顶端。

可以选择使用 -c-C 创建一个新分支,从具有相同名称的远程分支自动创建(见 --guess),或者使用 --detach 将工作树从任何分支分离,并同时切换。

切换分支不需要干净的索引和工作树(即与 HEAD 相比没有差异)。然而,如果操作会导致本地更改丢失,则操作将中止,除非使用 --discard-changes--merge 指示否则。

此命令是实验性的。行为可能会改变。

选项

<branch>

要切换到的分支。

<new-branch>

新分支的名称。

<start-point>

新分支的起点。指定 <start-point> 允许你在 HEAD 当前指向的位置以外的历史记录中的某个其他位置创建分支。(或者,在 --detach 的情况下,允许你检查并从其他位置分离)。

你可以使用 @{-N} 语法来引用使用“git switch”或“git checkout”操作切换到的第 N 个最后的分支/提交。你也可以指定 -,它与 @{-1} 同义。这通常用于快速切换两个分支,或撤消误操作的分支切换。

作为一种特殊情况,你可以使用 A...B 作为 AB 的合并基的快捷方式,前提是它们只有一个合并基。你可以省略最多一个 AB,在这种情况下它默认为 HEAD

-c <new-branch>
--create <new-branch>

在切换到分支之前,创建一个名为 <new-branch> 的新分支,从 <start-point> 开始。这相当于事务性的

$ git branch <new-branch>
$ git switch <new-branch>

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

-C <new-branch>
--force-create <new-branch>

类似于 --create,只是如果 <new-branch> 已经存在,它将被重置为 <start-point>。这是一种方便的快捷方式,可以用于

$ git branch -f <new-branch>
$ git switch <new-branch>
-d
--detach

切换到一个提交以进行检查和可丢弃的实验。有关详细信息,请参阅 git-checkout[1] 中的“分离 HEAD”部分。

--guess
--no-guess

如果 <branch> 未找到,但确实存在一个跟踪分支(称为 <remote>)且名称匹配,则将其视为等效于

$ git switch -c <branch> --track <remote>/<branch>

如果分支存在于多个远程中,并且其中一个以 checkout.defaultRemote 配置变量命名,那么我们将使用它来消除歧义,即使 <branch> 在所有远程中不唯一。将其设置为例如 checkout.defaultRemote=origin,以便在 <branch> 模糊但存在于 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=<style>

与上面的 --merge 选项相同,但会更改冲突块的呈现方式,覆盖 merge.conflictStyle 配置变量。可能的取值是“merge”(默认)、“diff3”和“zdiff3”。

-q
--quiet

安静,抑制反馈消息。

--progress
--no-progress

默认情况下,当进度状态连接到终端时,它会在标准错误流上报告进度状态,除非指定了 --quiet。此标志即使在未连接到终端时也会启用进度报告,无论 --quiet 是否指定。

-t
--track [direct|inherit]

创建新分支时,设置“上游”配置。-c 被隐式包含。有关详细信息,请参阅 git-branch[1] 中的 --track

如果没有给出 -c 选项,新分支的名称将从远程跟踪分支推断出来,方法是查看为相应远程配置的 refspec 的本地部分,然后剥离从“*”开始的初始部分。这将告诉我们在从 origin/hack(或 remotes/origin/hack,甚至 refs/remotes/origin/hack)分支时使用 hack 作为本地分支。如果给定的名称没有斜杠,或者上面的推断导致名称为空,则推断将中止。在这种情况下,你可以使用 -c 显式给出名称。

--no-track

即使 branch.autoSetupMerge 配置变量为真,也不设置“上游”配置。

--orphan <new-branch>

创建一个名为 <new-branch> 的新未出生分支。所有跟踪文件都将被删除。

--ignore-other-worktrees

当想要引用的 ref 已经被另一个工作树签出时,git switch 会拒绝。这个选项可以让它无论如何签出 ref。换句话说,ref 可以被多个工作树保存。

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

使用 --recurse-submodules 将根据超级项目中记录的提交更新所有活动子模块的内容。如果使用空字符串(或 --no-recurse-submodules),子模块工作树将不会更新。就像 git-submodule[1] 一样,这将分离子模块的 HEAD

示例

以下命令切换到“master”分支

$ git switch master

在错误的分支上工作后,切换到正确的分支将使用以下命令完成

$ git switch mytopic

但是,你的“错误”分支和正确的“mytopic”分支可能在本地修改的文件中存在差异,在这种情况下,上面的切换将失败,如下所示

$ git switch mytopic
error: You have local changes to 'frotz'; not switching branches.

你可以向命令传递 -m 标志,它将尝试进行三次合并

$ git switch -m mytopic
Auto-merging frotz

在三次合并之后,本地修改不会在你的索引文件中注册,因此 git diff 将显示你自新分支的顶端以来所做的更改。

要切换回我们切换到 mytopic 之前的上一个分支(即“master”分支)

$ git switch -

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

$ git switch -c fixup HEAD~3
Switched to a new branch 'fixup'

如果你想从具有相同名称的远程分支开始一个新分支

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'

要临时检查或实验提交 HEAD~3,但不想创建新分支

$ git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'

如果你的修改值得保存,你可以随时为它创建新的名称(无需切换分支)

$ git switch -c good-surprises

配置

本节中该行以下的所有内容均从 git-config[1] 文档中选择性地包含。内容与该文档中的一致。

checkout.defaultRemote

当你运行 git checkout <something>git switch <something> 并且只有一个远程仓库时,它可能会隐式地回退到检出和跟踪例如 origin/<something>。当你拥有多个包含 <something> 引用时,这种方式将不再有效。此设置允许你设置首选远程仓库的名称,该名称应始终在进行歧义消除时优先考虑。常见的用例是将其设置为 origin

目前,当 git checkout <something>git switch <something> 会检出另一个远程仓库上的 <something> 分支时,此设置被 git-switch[1]git-checkout[1] 使用,而当 git worktree add 指向远程分支时,则被 git-worktree[1] 使用。将来,此设置可能会用于其他类似于检出的命令或功能。

checkout.guess

git checkoutgit switch 中的 --guess--no-guess 选项提供默认值。请参阅 git-switch[1]git-checkout[1]

checkout.workers

更新工作树时要使用的并行工作进程数量。默认值为 1,即顺序执行。如果设置为小于 1 的值,Git 将使用与可用逻辑核心数量一样多的工作进程。此设置和 checkout.thresholdForParallelism 会影响执行检出的所有命令。例如,checkout、clone、reset、sparse-checkout 等。

注意:对于位于 SSD 上或通过 NFS 的仓库,并行检出通常可以带来更好的性能。对于旋转磁盘上的仓库和/或核心数量较少的机器,默认的顺序检出通常会表现得更好。仓库的大小和压缩级别也可能会影响并行版本的性能。

checkout.thresholdForParallelism

在使用少量文件运行并行检出时,子进程生成和进程间通信的成本可能会超过并行化的收益。此设置允许你定义尝试并行检出的最小文件数量。默认值为 100。

GIT

git[1] 套件的一部分

scroll-to-top