设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.44.1 → 2.47.0 无变化
- 2.44.0 02/23/24
- 2.43.2 → 2.43.5 无变化
- 2.43.1 02/09/24
- 2.43.0 11/20/23
- 2.38.1 → 2.42.3 无变化
- 2.38.0 10/02/22
- 2.35.1 → 2.37.7 无变化
- 2.35.0 01/24/22
- 2.30.1 → 2.34.8 无变化
- 2.30.0 12/27/20
- 2.27.1 → 2.29.3 无变化
- 2.27.0 06/01/20
- 2.23.1 → 2.26.3 无变化
- 2.23.0 08/16/19
概要
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
作为A
和B
的合并基的快捷方式,前提是它们只有一个合并基。你可以省略最多一个A
和B
,在这种情况下它默认为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 checkout
和git 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] 套件的一部分