【问题标题】:Checking out non existing branch does not give error签出不存在的分支不会给出错误
【发布时间】:2019-06-10 12:03:46
【问题描述】:

我在使用 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 branch 没有用星号标记它)。这是怎么回事?

编辑:解决重复标志和 cmets:我知道这是分支区分大小写的问题,但事实并非如此。我的问题更具体:为什么第二次错误结帐并没有失败,而是把我带到了这种奇怪的情况?

评论中要求的输出是:

>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

【问题讨论】:

  • 您是否在 Windows 上使用 Git(文件名不区分大小写)?
  • 是的,它在 Windows 上
  • 请显示 git branch -av 的结果
  • 在 Windows 上,您甚至可以将 git 运行为 GIT(全部大写),这不是 Git 问题。同样的情况也发生在 macOS 上。当您将文件系统称为gitGITGit 时,文件系统会找到(相同的)Git 可执行文件。当git checkout develop 正在寻找.git/refs/heads/develop 文件时也会发生同样的事情,因为Git 将引用(分支、标签)保存在文件中。本地Develop分支保存在.git/refs/heads/Develop,本地foo/bar分支保存在.git/refs/heads/foo/bar,远程origin/Develop分支保存在.git/refs/remotes/origin/Develop等等。

标签: git


【解决方案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 使用松散引用将该信息存储在不区分大小写的文件系统上,因此它找到了 信息。 p>

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

【讨论】:

  • 感谢您的回答,但一些细节仍然困扰着我。如果是这样,为什么git status 不向我显示我在Develop 上,它显示就像我不在分支上一样?听起来如果我现在要提交一些东西,它就会丢失。另外,为什么 Git 不考虑大小写来避免这个问题?
  • 不是在开发中。您试图检查一个名为“develop”的分支,Git 的分支存储机制在不区分大小写的文件系统上被破坏,并让您进入这种状态。至于为什么 Git 没有解决这个问题,你需要问问作者,他们已经忽略了这个问题十多年了。
  • 对我来说已经足够了。如果您愿意,请使用此新信息更新答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多