亲测可用,若有疑问请私信
针对以下几个问题,来谈谈在使用git时,会遇到的大小写问题:
- 新克隆的仓库,什么都没做,却存在修改
- 切换分支,切几次都不成功,但也不报错
- 推送本地分支到远端时报错:can not be resolved to branch
- 切换分支后,本地的头节点与远端上的不一致(切换之前已经fetch all了)
- 本地更新分支时报错:can not lock ref xxx: ref xxx is at xxx but expected xxx
第一个问题
- 当仓库中存在文件名相同,但是大小写不同时,如果你在windows上进行克隆操作,克隆完成后,进入仓库去执行git status查看是会存在修改的,为此git-2.20版本增加了warning来提示用户:
warning: the following paths have collided (e.g. case-sensitive paths on a case-sensitive filesystem) and only one from the same colliding group is in the working tree:
- 如果你仓库使用了LFS,也有可能出现刚克隆完,就存在修改的问题,这个问题,以后再详细阐述吧
解决方案的话:没有好的解决方案,建议在linux下,将出问题的文件名修改掉,上库
第二个问题
1. 正常切换分支时,git是会在命令窗口中输出:
Switching to branch xxx
2. 如果当前目录下,存在跟你分支命同名的文件夹或文件时,在git-2.21版本之前,执行git checkout时,是不会有任何输出的,但可以通过git checkout xxx --来切换分支,通过git checkout -- xxx来回退文件
3. git-2.21为了消除分支名和文件名同名的歧义,增加了日志打印:
Fatal: xxx could be both a local file and a tracking branch.
Please use -- (and optionally --no-guess) to disambiguate
4. 分析下命令git checkout xxx:
如果是本地分支名,切换过去
如果是被跟踪的路径名,重置它
如果是远端分支名,创建分支,并切换过去
第三个问题
对于分支名带有/的会出现上述报错,先简单地来复现一下:
- 创建一个分支为:A/test-1
- 再创建一个分支为:a/new-1
- 将分支a/new-1推送到远端,报错:
Fatal: can not be resolved to branch
问题的原因是:
- 创建分支时,git会在本地.git/refs/heads/文件夹下创建一个以分支名命名的文件,用来跟踪这个分支指向的头节点
- 上述过程,首先会创建A文件夹,然后在它下面创建test-1文件
- 当创建第二个分支时,由于windows是不区分大小写的,所以直接在A文件夹下创建了new-1文件
- 最后执行git push origin a/new-1时就报错了
解决方案就是:
- 重命名分支名
- 删除A/test-1分支,同时在删除A文件夹,再创建a/new-1分支
第四个问题
这是本地存在分支名和tag名同名的情况,所以也一起说一下。
虽然它们名字相同,但是头节点不同,这样可能会导致在开发过程基于它们拉出来的分支会不一样,开发的功能也会有影响。
解决方案:重命名分支或者tag
总结
分支/Tag命名很重要,就像命名函数,变量一样,要有意义,能自解释,不产生歧义、冲突。如果开发平台有涉及windows的话,还要注意大小写的问题,要尽量避免