设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.50.1 无更改
-
2.50.0
2025-06-16
- 2.44.1 → 2.49.1 无更改
-
2.44.0
2024-02-23
- 2.43.2 → 2.43.7 无变更
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.38.1 → 2.42.4 无更改
-
2.38.0
2022-10-02
- 2.35.1 → 2.37.7 无更改
-
2.35.0
2022-01-24
- 2.30.1 → 2.34.8 无更改
-
2.30.0
2020-12-27
- 2.27.1 → 2.29.3 无更改
-
2.27.0
2020-06-01
- 2.23.1 → 2.26.3 无更改
-
2.23.0
2019-08-16
概要
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}
。这通常用于在两个分支之间快速切换,或撤销错误的分支切换。作为一种特殊情况,如果存在且只有一个合并基础,您可以使用 <rev-a>
...
<rev-b> 作为 <rev-a> 和 <rev-b> 的合并基础的快捷方式。您最多可以省略 <rev-a> 和 <rev-b> 中的一个,在这种情况下它默认为HEAD
。 -c
<new-branch>--create
<new-branch>-
在切换到新分支之前,从 <start-point> 创建一个名为 <new-branch> 的新分支。这等同于事务性的
$ 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
选项,新分支的名称将从远程跟踪分支派生,方法是查看为相应远程配置的引用规范的本地部分,然后剥离直到“*”的初始部分。这将告诉我们在从origin/hack
(或remotes/origin/hack
,甚至refs/remotes/origin/hack
)分支出来时使用hack
作为本地分支。如果给定的名称没有斜杠,或者上述猜测导致空名称,则猜测中止。在这种情况下,您可以使用-c
显式提供一个名称。 --no-track
-
不设置“上游”配置,即使
branch.autoSetupMerge
配置变量为 true。 --orphan
<new-branch>-
创建一个名为 <new-branch> 的新的未诞生分支。所有被跟踪的文件都将被移除。
--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
然而,您的“错误”分支和正确的“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-switch[1] 和 git-checkout[1] 在
git
checkout
<something> 或git
switch
<something> 将检出另一个远程上的 <something> 分支时使用此功能,并且 git-worktree[1] 在git
worktree
add
引用远程分支时也使用此功能。此设置将来可能会用于其他类似检出的命令或功能。 checkout.guess
-
为
git
checkout
和git
switch
中的--guess
或--no-guess
选项提供默认值。参见 git-switch[1] 和 git-checkout[1]。 checkout.workers
-
更新工作区时使用的并行工作进程数量。默认值为一,即顺序执行。如果设置为小于一的值,Git 将使用与可用逻辑核心数一样多的工作进程。此设置和
checkout.thresholdForParallelism
影响所有执行检出操作的命令。例如:checkout、clone、reset、sparse-checkout 等。注意并行检出通常在位于 SSD 或通过 NFS 访问的仓库中提供更好的性能。对于位于旋转磁盘和/或核心数量较少的机器上的仓库,默认的顺序检出通常性能更好。仓库的大小和压缩级别也可能影响并行版本的性能。 checkout.thresholdForParallelism
-
当以少量文件运行并行检出时,子进程生成和进程间通信的开销可能超过并行化的收益。此设置允许您定义应尝试并行检出的最小文件数。默认值为 100。