tdrk's diary

とある情報系大学生。主には自分のための備忘録...になる予定

「zsh: no matches found: HEAD^」と怒られる問題について

zshでgitを使っていて、ブランチからの相対位置でコミットを指定したいとき、
たとえば、

git checkout master^

ってやるとmasterブランチの親をチェックアウトできますよね。
そんな時に

zsh: no matches found: master^

と怒られる場合の対処法について。


(´・ω・`)
「なんで怒られるんだろう...」
「コマンド間違ってないしなー」
って思っていたけど、
キャレット「^」じゃなくてチルダ「~」を使って

git checkout master~

ってやれば一番上と同じ操作できるから、とりあえずそれでいいやと思って何も対策してませんでした。

でも、次みたいに

git checkout master^2

あるコミットの2つ目の親を指定したいときに不便だなと思ったのでこの際しっかり対策しようと思います。


結論だけ言うと、
zsh+git使ってる時にキャレットを自動エスケープする | きーたろう QiitaAPIで検索しちゃう!
こちらのサイトに書かれていることを実行しただけです。

とりあえず、備忘録としてやったことを残しておきます。

まず、怒られる原因はzshの設定ファイル内で「extended_glob設定」をしていることでした。
これによってキャレットが特殊文字とみなされてしまうそうです。
この設定は便利なので残しておきたいと思うので、どうすればいいかというとキャレットをエスケープすればよいそうです。

git checkout master\^

こんな感じですね。

毎回打っても大した労力ではないのですが、
キャレットを打つと自動的に

\^

と展開してくれるものがあるそうなので、喜んで導入しようと思います。
knu/zsh-git-escape-magic · GitHub


以下が操作手順です。

mkdir ~/.functions
git clone https://github.com/knu/zsh-git-escape-magic
mv zsh-git-escape-magic/git-escape-magic ~/.functions/git-escape-magic

そしてzshrcに次のことを追記

# git環境下でキャレット(^)の自動エスケープ
fpath=(~/.functions ${fpath})
autoload -Uz git-escape-magic
git-escape-magic

これで

git checkout HEAD^

などとキャレットを入力すると

git checkout HEAD\^

と自動的に展開してくれます!便利!!