我正在使用 zsh shell 和 prezto 以及 cygwin。当我输入这个 git 命令时:
git reset HEAD5
zsh 返回:
zsh: no matches found: HEAD^
但是当我切换到使用 bash shell 时,它就可以工作了。
当我尝试使用 HEAD^
时,为什么 zsh 会抛出错误?
最佳答案
在 zsh 中,^
字符在文件名扩展中被视为特殊字符,但前提是设置了 EXTENDED_GLOB
选项:
zsh% setopt noEXTENDED_GLOB
zsh% echo HEAD^
HEAD^
zsh% setopt EXTENDED_GLOB
zsh% echo HEAD^
zsh: no matches found: HEAD^
zsh%
Bash没有这个功能。 (准确地说,bash 确实具有扩展的 glob 功能,由 shopt -s extglob
启用,但 bash 的扩展 glob 语法并不将 ^
字符视为特殊字符。)
启用此功能后,^
是一个类似于 *
的特殊字符,但含义不同。与 *
一样,您可以通过转义来抑制其特殊含义,方法是将其括在单引号或双引号中,或者在其前面添加反斜杠。引用是最简单的解决方案。
而不是
git reset HEAD^
试试这个:
git reset 'HEAD^'
^
通配符的含义并不相关,因为您所需要做的就是避免使用它,但无论如何我都会提到它。根据 zsh 手册,^X
匹配除模式 X
之外的任何内容。对于 HEAD^
的情况,^
后面没有任何内容 - 这意味着 HEAD^
与 HEAD
匹配,后跟除了什么都没有之外的任何东西。这是一种迂回的说法,HEAD^
匹配以 HEAD
开头并后跟一些非空字符串的文件名。给定文件 HEAD
、HEAD1
和 HEAD2
,模式 HEAD^
与 HEAD1
匹配和HEAD2
。
关于git - zsh shell 无法识别 git HEAD^,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26292192/