我在 cygwin 中使用 zsh 和 prezto。当我输入这个 git 命令 'git reset HEAD5' 时,zsh 没有找到 HEAD^。但是当我切换到使用 bash 时,它可以工作。
$ git reset HEAD^
zsh: no matches found: HEAD^
有没有人看到同样的问题?
该^
字符在 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
匹配除pattern 之外的任何内容X
。对于 的情况HEAD^
,^
-- 后面没有任何内容,这意味着HEAD^
匹配项HEAD
后跟任何其他内容。这是一种迂回的说法,它匹配以一些非空字符串HEAD^
开头和后跟的文件名。HEAD
给定文件HEAD
、HEAD1
和HEAD2
,模式HEAD^
匹配HEAD1
和HEAD2
。
避免该^
字符的快速解决方法是使用git reset head~1
而不是git reset head^
.
有关两者之间的区别,请参阅此帖子。
oh-my-zsh 的第 449期描述了这种确切的行为并提供了解决方案。
罪魁祸首是extended_glob
zsh 上的选项。Presto 必须设置它。因此,当您键入HEAD^
zsh 时,尝试创建一个 glob 否定表达式并失败并出现错误。
换句话说,setopt extended_glob
允许我们用来^
否定 glob。
要修复它,您可以在您的.zshrc
:
unsetopt nomatch
上面这行,我们对 zsh 说,我们希望当模式匹配失败时,只需“按原样”使用命令。
在 Mac 上转义命令中的 ^:
git reset --soft HEAD\^