签出不存在的分支不会给出错误

时间:2019-01-16 11:48:12

标签: git

在使用git时,我注意到一种奇怪的行为。

假设我在this repository上工作,这只是一个带有多个分支的存储库的示例。

我将仅显示命令序列以及相关答案,然后简要解释我不了解的内容:

>git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

>git branch
* master

>git checkout develop
error: pathspec 'develop' did not match any file(s) known to git.

>git checkout Develop
Switched to a new branch 'Develop'
Branch 'Develop' set up to track remote branch 'Develop' from 'origin'.

>git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

>git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

>git branch
  Develop
* master

>git checkout develop
Switched to branch 'develop'

>git branch
  Develop
  master

>git status
On branch develop
nothing to commit, working tree clean

我基本上签出了一个远程分支,但在名称方面却犯了一个错误。如果我没有跟踪远程的本地分支(因此,如果我没有与要使用其他大小写的结帐分支相等的分支),则它会失败,否则我将处于这种稳定状态,即我位于一个不存在的分支上(它不是一个大写字母,因为git分支不会用星号标记它)。这是怎么回事?

编辑:解决重复标记和注释:我知道这是分支区分大小写的问题,并非如此。我的问题更具体:为什么第二次错误结帐不会失败,但是会带我到这种奇怪的情况?

在注释中要求的输出是:

>git branch -av
  Develop                4fc788f pdf added3
  master                 4fc788f pdf added3
  remotes/origin/Develop 4fc788f pdf added3
  remotes/origin/HEAD    -> origin/master
  remotes/origin/master  4fc788f pdf added3

>git --version
git version 2.17.1.windows.2

1 个答案:

答案 0 :(得分:1)

这是区分大小写的问题。首次尝试检出develop分支时:

>git checkout develop
error: pathspec 'develop' did not match any file(s) known to git.

没有名为develop的本地分支。由于分支信息的存储方式存在区分大小写的问题,因此,如果命名为Develop的本地分支存储为松散引用,则可能会将其标识为与分支名develop匹配。但是,此时,都不存在,所以没有意义。

>git checkout Develop
Switched to a new branch 'Develop'
Branch 'Develop' set up to track remote branch 'Develop' from 'origin'.

没有名为Develop的本地分支。正如我们在前面的命令中了解到的那样,也没有一个名为develop的名称。但是,有一个远程分支origin/Develop。因此git假设您要创建它,因此它创建了一个跟踪Develop的分支origin/Develop

因此,下次运行时:

>git checkout develop
Switched to branch 'develop'

同样,git查找一个名为develop的本地分支。您仍然没有一个。但是,您要做有一个Develop分支,并且由于git使用了一个松散引用来将该信息存储在不区分大小写的文件系统上,因此可以找到 信息。

令人遗憾的是,git对这种情况一直感到困惑:当您请求develop分支时,它找到了有关Develop的信息。但是尽管如此,git的分支名称区分大小写。而且由于实际上没有 一个名为develop的分支(小写),因此您现在处于一种奇怪的状态,实际上您不在git知道的任何分支上。