我在 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_globzsh 上的选项。Presto 必须设置它。因此,当您键入HEAD^zsh 时,尝试创建一个 glob 否定表达式并失败并出现错误。
换句话说,setopt extended_glob允许我们用来^否定 glob。
要修复它,您可以在您的.zshrc:
unsetopt nomatch
上面这行,我们对 zsh 说,我们希望当模式匹配失败时,只需“按原样”使用命令。
在 Mac 上转义命令中的 ^:
git reset --soft HEAD\^