zsh无法识别HEAD ^

mic*_*ael 5 cygwin zsh prezto

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

$ git reset HEAD^                                        
zsh: no matches found: HEAD^
Run Code Online (Sandbox Code Playgroud)

有没有人见过同样的问题?

Kei*_*son 11

^在zsh中,该字符在文件名扩展中被视为特殊字符,但仅在EXTENDED_GLOB设置了该选项时:

zsh% setopt noEXTENDED_GLOB
zsh% echo HEAD^
HEAD^
zsh% setopt EXTENDED_GLOB
zsh% echo HEAD^
zsh: no matches found: HEAD^
zsh% 
Run Code Online (Sandbox Code Playgroud)

Bash没有此功能.(确切地说,bash确实有一个扩展的glob功能,启用shopt -s extglob,但是bash的扩展glob语法不会将该^字符视为特殊字符.)

启用此功能后,^是一个类似*但具有不同含义的特殊字符.比如*,你可以通过将其括在单引号或双引号中或者用反斜杠括起来来禁止它的特殊含义.报价是最简单的解决方案.

而不是

git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

试试这个:

git reset 'HEAD^'
Run Code Online (Sandbox Code Playgroud)

^通配符的含义是不相关的,因为您需要做的就是避免使用它,但无论如何我都会提到它.根据zsh手册,^X匹配模式之外的任何内容X.对于这种情况HEAD^,没有任何内容^- 这意味着HEAD^匹配HEAD后跟任何东西都没有.这是一种迂回的方式,说HEAD^匹配文件名HEAD以一些非空字符串开头,后跟一些非空字符串.给定文件HEAD,HEAD1HEAD2,模式HEAD^匹配HEAD1HEAD2.


Mat*_*att 5

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

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