我刚刚创建了一个名为 daco 的新分支。
git checkout -b daco
Run Code Online (Sandbox Code Playgroud)
然后我尝试删除它。我知道这会出错,而且确实如此。
git branch -D daco
Run Code Online (Sandbox Code Playgroud)
错误:无法删除分支“daco”
但是当我尝试以这种方式删除时:
git branch -D Daco
Run Code Online (Sandbox Code Playgroud)
它被删除没有问题。
你知道为什么吗?
它\xe2\x80\x99是不区分大小写的文件系统的产物,就像Windows上的那样。Git 在内部将分支存储为.git/refs文件夹内的文件和目录。
因此,当您创建名为 的分支时,会在该文件夹内创建foo一个名为 的文件。由于您是通过命令完成的,因此 git 还会记录现在已签出的分支。因此,当您尝试删除分支时,git 会看到这是已签出的分支并给出错误。foorefs/headscheckoutfoofoofoo
现在,当您尝试删除名为 的分支时,git 首先检查文件夹中Foo是否存在名为 的文件,这就是它变得奇怪的地方:Foorefs/heads
由于您的文件系统不区分大小写,Foo因此作为文件名, 是等效的foo。因此,文件系统会报告该路径refs/heads/Foo存在,而实际上它\xe2\x80\x99s refs/heads/foo。但是,当 git 检查是否Foo是签出分支时,它会发现不是Foo签出分支,因为 git 内部是区分大小写的,因为它不等于。因此,git 错误地确定:是一个现有分支,与 不同,并且不是已签出分支。因此,git 允许你删除.foo"Foo""foo"fooFooFooFoo