问题
有人能解释一下发生了什么吗?[…我希望能够删除该分支,但Git不适合我。
通过运行
git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery
在zsh中,您没有创建任何分支。相反,您无意中定义了三个shell函数,分别称为git、branch和ssloc - 201_implement__str__,它们忽略了它们的参数(如果有的话),其主体是_of_ProductSearchQuery。你可以自己检查,这确实是发生了什么,通过调用内置的zsh命令函数,它列出了所有现有的shell函数:
$ functions
SSLOC-201_Implement___str__ () {
_of_ProductSearchQuery
}
branch () {
_of_ProductSearchQuery
}
git () {
_of_ProductSearchQuery
}
不幸的是,尽管其他两个shell函数没有问题,但shell函数“git”现在掩盖了真正的git命令!
$ which git
git () {
_of_ProductSearchQuery
}
# but the real "git" is a binary file that lives in /usr/local/bin/git (or some similar path)
因此,您随后会得到错误
command not found: _of_ProductSearchQuery
当你试图运行Git命令时,例如Git日志,Git状态等(当然,假设不存在名为_of_ProductSearchQuery的命令)。
边注
[…我得到了同样的错误:
git:176: command not found: _of_ProductSearchQuery
(每次我输入一个命令,git后的数字都会增加)
这个数字仅仅对应于HISTCMD的值,这是一个环境变量
交互式shell中的当前历史事件号,换句话说,就是导致$HISTCMD被读取的命令的事件号。
更多细节请参阅zsh手册。
解决方案
我怎么才能恢复正常?
只需删除有问题的shell函数(以及其他两个您意外创建的函数):
unset -f git
unset -f branch SSLOC-201_Implement___str__
那么一切都会好起来的。
如果未设置也是阴影呢?!
好问题!我推荐你参考下面Wumpus W. Wumbley的精彩评论。
Branch-naming技巧
避免使用任何特殊的shell字符
是的,正如评论中指出的,括号在Git分支名称中是有效的字符;你只需要适当地引用名字就可以了。
$ git branch 'foo()bar'
$ git branch
foo()bar
* master
$ git checkout 'foo()bar'
Switched to branch 'foo()bar'
但是,在每次使用这些名称作为命令行参数时都需要引用这些名称,这应该说服您在引用名称中避免使用括号。更一般地,您应该(尽可能地)避免在shell中具有特殊含义的字符,以防止像这样的意外。
使用简单的分支名称
无论如何,您都应该保持分支名称简短而温馨。冗长的描述,比如
_of_ProductSearchQuery ssloc - 201 _implement___str__ ()
属于提交消息,而不是分支名称。