我正在使用zsh和prezto与cygwin。当我输入这个git命令'git reset HEAD5'时,zsh找不到HEAD ^。 但是,当我切换到使用bash时,它可以工作。
$ git reset HEAD^
zsh: no matches found: HEAD^
有没有人见过同样的问题?
答案 0 :(得分:9)
{1}}字符在zsh中的文件名扩展中被视为特殊字符,但仅在设置了^
选项时才会被视为:
EXTENDED_GLOB
Bash没有此功能。 (确切地说,bash确实有一个扩展的glob功能,由zsh% setopt noEXTENDED_GLOB
zsh% echo HEAD^
HEAD^
zsh% setopt EXTENDED_GLOB
zsh% echo HEAD^
zsh: no matches found: HEAD^
zsh%
启用,但是bash的扩展glob语法不会将shopt -s extglob
字符视为特殊字符。)
启用此功能后,^
是一个与^
类似的特殊字符,但含义不同。与*
类似,您可以通过将其括在单引号或双引号中或者在其前面加上反斜杠来禁止它的特殊含义。报价是最简单的解决方案。
而不是
*
试试这个:
git reset HEAD^
git reset 'HEAD^'
通配符的含义不相关,因为您需要做的就是避免使用它,但无论如何我都会提到它。根据zsh手册,^
匹配除模式^X
之外的任何内容。对于X
的情况,HEAD^
后面没有任何内容 - 这意味着^
匹配HEAD^
后跟任何其他内容。这是一种迂回的说法,HEAD
匹配以HEAD^
开头的文件名,后跟一些非空字符串。给定文件HEAD
,HEAD
和HEAD1
,模式HEAD2
匹配HEAD^
和HEAD1
。
答案 1 :(得分:3)
issue 449描述了这种确切的行为并提供了解决方案。
罪魁祸首是zsh上的选项extended_glob
。 Presto必须设置它。因此,当您键入HEAD^
时,zsh尝试创建一个glob否定表达式并失败并显示错误。
换句话说,setopt extended_glob
允许我们使用^
来否定全局。
要解决此问题,您可以在.zshrc
上写下这一行:
unsetopt nomatch
通过以上这一行,我们说zsh我们希望当模式匹配失败时,只需使用命令"原样"。
答案 2 :(得分:1)
避免使用^
字符的快速解决方法是使用git reset head~1
代替git reset head^
。