git reset --hard でファイルの変更は取り消せない

ファイルの変更を取り消そうと思って

$ git reset --hard file

としたら

fatal: Cannot do hard reset with paths.

と怒られた。

$ git reset --hard HEAD file

とか

$ git reset --hard HEAD -- file

とか試してもやっぱり怒られる。


じゃあどうすればファイルの変更を取り消せるのかというと

$ git checkout file

とすれば良いみたい。



なんで reset では取り消せないのか調べてみたところ、

git reset [-q] [] [--]
git reset [--patch|-p] [] [--] […]
git reset [--soft | --mixed | --hard | --merge | --keep] [-q] []

git-reset(1)

とあった。
つまり、--hard を指定する場合、引数には しか指定できない。


一方、checkout の場合、

git checkout [-q] [-f] [-m] []
git checkout [-q] [-f] [-m] [--detach] []
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] ] []
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [] [--]
git checkout [-p|--patch] [] [--] […]

git-checkout(1)

とのことで、こちらは問題なくファイルを指定できる。


checkout なんてブランチの切り替えくらいにしか使ってなかったけど、
なかなか git も奥が深い。