zshだとgit reset HEAD^とか、とにかく「^」が使えない。そんなとき。

  • 8
    いいね
  • 4
    コメント

解決法

zsh-git-escape-magicを使う。

@quenhuluさんからのご紹介です。導入も簡単でとても便利です。ありがとうございます!

zsh-git-escape-magic を使うと ^ などが自動でエスケープされます。
https://github.com/knu/zsh-git-escape-magic

その他

エスケープする。

バックスラッシュ

% git reset HEAD^
# => zsh: no matches found: HEAD^
# お好きなものを
% git reset HEAD\^
% git reset --soft HEAD\^
% git reset --hard HEAD\^
% git reset HEAD\^\^
% git reset HEAD\^\^\^
# ・・・

クォート

@hage@githubさんからのご紹介です。キャレット(^)が多い時に見やすくて有効ですね、ありがとうございます!

エスケープする方法の他にクオートする方法があります。
% git reset 'HEAD^'

HEAD@に置き換えれる

こちらも@hage@githubさんからのご紹介です。git 1.8.5よりHEADのエイリアスとして@が使えるようになったようです。タイプ数が3も減るのは素晴らしいですね。ありがとうございます!

それとどのバージョンからか忘れましたが、HEADのエイリアスとして@が用意されました。以下の二つは同じ意味です。
% git reset 'HEAD^'
% git reset '@^'

こんな方法も。

zsh の exntended_glob と HEAD^^^ を共存させる。 - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。 - subtech

原因

便利なextended_globオプションが原因。
setopt extended_glob のようにextended_globオプションをセットしていると起きてしまう。
extended_globにおいて^はパターン否定。
他にもいろいろあるです。

例)拡張子がtxtでないものをls
% ls
# => tororo.txt  tororo_dir/ totoro.txt  totoro_dir/
#     ~/lsls

% ls ^*.txt
# => tororo_dir:
#    
#    totoro_dir:
#     ~/lsls