10

我在 cygwin 中使用 zsh 和 prezto。当我输入这个 git 命令 'git reset HEAD5' 时,zsh 没有找到 HEAD^。但是当我切换到使用 bash 时,它可以工作。

$ git reset HEAD^                                        
zsh: no matches found: HEAD^

有没有人看到同样的问题?

4

4 回答 4

27

^字符在 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给定文件HEADHEAD1HEAD2,模式HEAD^匹配HEAD1HEAD2

于 2014-10-10T09:02:03.827 回答
5

避免该^字符的快速解决方法是使用git reset head~1而不是git reset head^.

有关两者之间的区别,请参阅此帖子。

于 2016-04-18T14:29:04.023 回答
4

oh-my-zsh 的第 449期描述了这种确切的行为并提供了解决方案。

罪魁祸首是extended_globzsh 上的选项。Presto 必须设置它。因此,当您键入HEAD^zsh 时,尝试创建一个 glob 否定表达式并失败并出现错误。

换句话说,setopt extended_glob允许我们用来^否定 glob。

要修复它,您可以在您的.zshrc:

unsetopt nomatch 

上面这行,我们对 zsh 说,我们希望当模式匹配失败时,只需“按原样”使用命令。

于 2016-04-28T21:35:58.927 回答
0

在 Mac 上转义命令中的 ^:

git reset --soft HEAD\^
于 2022-02-17T23:43:42.207 回答