在使用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
答案 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知道的任何分支上。