git switch和git checkout <branch>有什么区别


165

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

引入了两个新命令“ git switch”和“ git restore”,以拆分“签出分支以改进其历史记录”和“签出索引之外的路径和/或树状代码以推进当前操作” “ git checkout”命令中删除“历史记录”。


2
:有在相关的好文章有关此主题的infoq.com/news/2019/08/git-2-23-switch-restore
rsenna

Answers:


179

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

  • git switch现在可以用来改变分支机构,git checkout <branchname>
  • git restore可用于重置文件到某些修改,如git checkout --<path_to_file>

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


32
这似乎是个不错的改变。做一个分支?git checkout切换分支?git checkout获取文件的特定版本?git checkout删除对一个文件的更改?git checkout老实说,我想知道使用各种标志可以完成多少正常的git工作流程git checkout
上尉曼

5
那么,现在git checkout是技术上不再需要的想法了吗?还是在某些事情上仍在使用它,例如检出不是分支头的提交(移至“分离头”模式)?
PieterNuyts

5
@Mike当您说结帐成为分支后,您如何说结帐不会使分支成为一句话?-b标志的内部运作无关紧要。它仍然是一个分支。
曼队长

5
@CaptainMan,该checkout 操作不会创建分支,它只能切换到已经存在的分支。该命令-b选项在实际执行检出之前在内部执行。就像+的快捷方式一样。checkout git branchgit pullgit fetchgit merge
迈克,

7
有用的注释:对于那些习惯于使用的人,git checkout -b <branch name>可以使用git switch -c <branch name>以获得相同的效果
Xeuron

72

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

如果您修改文件但还没有上演更改,git checkout <filename>则将撤消修改...一种取消文件更改的快捷简便的方法。您保留在同一分支中。

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

两种完全不同的用途,如果文件名和分支名相似,则可能导致混淆。

将其作为两个命令更为清晰。


正如您提到的,具有相同名称的分支和文件令人困惑。我认为分支优先于文件,因为这样通常更合乎需要?或如何运作?
AgentM '04年

@AgentM是的,这是正确的。如果分支和文件具有相同的名称,则这样做git checkout <name>会优先考虑分支而不是文件。
Kartik Soneji

3

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


3
我认为这实际上是一个功能,而不是错误(限制)。switch仅出于更改分支的目的而创建,而这样做时,您确实想位于该分支的HEAD位置。checkout是更通用的操作,可使您的工作副本与历史记录中的任何给定状态(=提交)保持一致。由于任何分支名称都是该分支的HEAD提交的别名,因此签出分支在技术上与签出任何其他提交没有什么不同。
Mike Mike

16
-d您可以:git switch -d 6c13
Mendi Barel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.