415

Git 2.23引入了一个新命令——在阅读了文档之后,它似乎与有人可以解释差异或用例git switch几乎相同吗?git checkout <branchname>

引入了两个新命令“git switch”和“git restore”来拆分“签出分支以推进其历史”和“签出索引和/或树状路径以推进当前历史”从单个“git checkout”命令中提取出来。

4

6 回答 6

407

好吧,根据您链接到的文档,其唯一目的是拆分和阐明 的两种不同用途git checkout

  • git switch现在可以用来改变分支,git checkout <branchname>就像
  • git restore可用于将文件重置为某些版本,git checkout --<path_to_file>

人们对这些不同的使用方式感到困惑git checkout,正如您可以从git checkoutStackoverflow 上有关此处的许多问题中看到的那样。Git 开发人员似乎已经考虑到了这一点。

于 2019-07-30T07:00:51.577 回答
142

git checkout有点像瑞士军刀,有几个不相关的用途。

如果您修改了文件但尚未暂存更改,git checkout <filename>则将撤消修改...取消对文件的更改的快速简便的方法。你留在同一个分支。

git checkout <branchname>(如您所述)切换分支。

两个完全不同的目的,如果文件名和分支名相似,可能会导致混淆。

将它作为两个命令更清楚。

于 2019-07-30T07:00:48.437 回答
39

switch命令确实与 执行相同的操作checkout,但仅适用于切换分支的那些用法。值得注意的是checkout,它不能恢复工作树文件。

正如您在引用的 2.23.0 发行说明部分中指出的那样,引入了switchandrestore命令以将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选项给出,而不是作为内联参数
于 2021-12-22T20:32:39.937 回答
6

switch有一些限制:目前您可以任何提交切换到<branch name>,但是不可能从状态为分离的 HEAD 切换 特定<branch name>提交。所以你需要使用(其中 5efb 是对任意提交的哈希引用的示例)git checkout 5efb

于 2020-06-21T20:00:24.403 回答
0

这是 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-changesor另有说明--merge

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

于 2021-11-09T09:58:28.820 回答
-2

你会得到不同的效果。当你结帐时,你会得到你结帐的分支的文件。如果您切换分支更改但文件没有更改。如果您提交,则提交将转到该分支。如果您正在编辑但签出,则文件将重置为签出的文件状态,可能会丢失工作或获得所需的还原。

于 2021-09-16T01:49:23.483 回答