Git 2.23引入了一个新命令——在阅读了文档之后,它似乎与有人可以解释差异或用例git switch
几乎相同吗?git checkout <branchname>
引入了两个新命令“git switch”和“git restore”来拆分“签出分支以推进其历史”和“签出索引和/或树状路径以推进当前历史”从单个“git checkout”命令中提取出来。
Git 2.23引入了一个新命令——在阅读了文档之后,它似乎与有人可以解释差异或用例git switch
几乎相同吗?git checkout <branchname>
引入了两个新命令“git switch”和“git restore”来拆分“签出分支以推进其历史”和“签出索引和/或树状路径以推进当前历史”从单个“git checkout”命令中提取出来。
好吧,根据您链接到的文档,其唯一目的是拆分和阐明 的两种不同用途git checkout
:
git switch
现在可以用来改变分支,git checkout <branchname>
就像git restore
可用于将文件重置为某些版本,git checkout --<path_to_file>
如人们对这些不同的使用方式感到困惑git checkout
,正如您可以从git checkout
Stackoverflow 上有关此处的许多问题中看到的那样。Git 开发人员似乎已经考虑到了这一点。
git checkout
有点像瑞士军刀,有几个不相关的用途。
如果您修改了文件但尚未暂存更改,git checkout <filename>
则将撤消修改...取消对文件的更改的快速简便的方法。你留在同一个分支。
git checkout <branchname>
(如您所述)切换分支。
两个完全不同的目的,如果文件名和分支名相似,可能会导致混淆。
将它作为两个命令更清楚。
该switch
命令确实与 执行相同的操作checkout
,但仅适用于切换分支的那些用法。值得注意的是checkout
,它不能恢复工作树文件。
正如您在引用的 2.23.0 发行说明部分中指出的那样,引入了switch
andrestore
命令以将checkout
命令拆分为两个单独的部分:
换句话说,checkout
是在做两件不同的事情,而这个版本将这些不同的事情中的每一个都分解成自己的重点命令。
checkout
可以在文档中的摘要描述中看到这种双重目的:
git-checkout - 切换分支或恢复工作树文件
添加命令的提交的提交消息switch
解释了基本原理:
“git checkout”做太多事情是许多用户困惑的根源(有时它甚至会咬旧计时器)。为了解决这个问题,该命令将分为两个新命令:切换和恢复。旧的“git checkout”命令仍然存在,直到所有(或大多数用户)都厌倦了它。
由此可见,引入新命令是为了通过两个集中命令而不是一个多用途命令来减少混乱。
请注意,截至 2021 年 12 月,新命令仍列为实验性 ( switch
, restore
):
此命令是实验性的。行为可能会改变。
我还没有在任何地方找到命令的完整比较。通过阅读文档,我认为这应该是一个相当完整的比较:
上一个命令 | 新命令 |
---|---|
git checkout <branch> |
git switch <branch> |
git checkout |
不适用(使用git status ) |
git checkout -b <new_branch> [<start_point>] |
git switch -c <new-branch> [<start-point>] |
git checkout -B <new_branch> [<start_point>] |
git switch -C <new-branch> [<start-point>] |
git checkout --orphan <new_branch> |
git switch --orphan <new-branch> |
git checkout --orphan <new_branch> <start_point> |
不适用(git switch <start-point> 然后使用git switch --orphan <new-branch> ) |
git checkout [--detach] <commit> |
git switch --detach <commit> |
git checkout --detach [<branch>] |
git switch --detach [<branch>] |
git checkout [--] <pathspec>…</code> |
git restore [--] <pathspec>…</code> |
git checkout --pathspec-from-file=<file> |
git restore --pathspec-from-file=<file> |
git checkout <tree-ish> [--] <pathspec>…</code> |
git restore -s <tree> [--] <pathspec>…</code> |
git checkout <tree-ish> --pathspec-from-file=<file> |
git restore -s <tree> --pathspec-from-file=<file> |
git checkout -p [<tree-ish>] [--] [<pathspec>…] |
git restore -p [-s <tree>] [--] [<pathspec>…] |
checkout
如该比较所示,可以通过将旧命令名称 ( )替换为新命令 ( switch
, )将一些先前的用法简单地转换为新命令restore
,而其他用法则需要额外调整。显着的变化包括:
-b
/-B
选项重命名为-c
/-C
--detach
现在在切换到分离的头部时总是需要它,以前它对于提交是可选的,但对于分支是必需的-s
选项给出,而不是作为内联参数switch
有一些限制:目前您可以从任何提交切换到<branch name>
,但是不可能从状态为分离的 HEAD 切换到 特定<branch name>
提交。所以你需要使用(其中 5efb 是对任意提交的哈希引用的示例)git checkout 5efb
这是 git 手册的摘录——<code>man 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
or另有说明--merge
。此命令是实验性的。行为可能会改变。
你会得到不同的效果。当你结帐时,你会得到你结帐的分支的文件。如果您切换分支更改但文件没有更改。如果您提交,则提交将转到该分支。如果您正在编辑但签出,则文件将重置为签出的文件状态,可能会丢失工作或获得所需的还原。