Git
ハイフン
ドット
checkout

知らずに使ってた【git checkout HEAD -- . 】の「--」ハイフンハイフンと「.」ドットの意味

知らずに使ってた【git checkout HEAD -- . 】の
「--」ハイフンハイフンと「.」ドットの意味

git checkout HEAD -- .

むかしむかし作業したファイルを元の状態に戻す魔法の呪文として教わった
git checkout HEAD -- .
git checkout -- .
git checkout HEAD .
git checkout .
どれも似たような挙動をして作業前の状態に戻してくれる
「--」と「.」ってなんぞや:thinking:

HEADについて

HEADは現在の作業ブランチの先頭コミットの別称。
たいていのコマンドで省略可能。
よってHEADの有無は省略しているかしていないかだけ。

checkoutの仕様を理解

ブランチを切り替えるとき

git checkout [-q] [-f] [-m] [<branch>]
ブランチ名を指定するとそのブランチに切り替わる

ファイルを特定の状態に切り替えるとき

git checkout [<tree-ish>] [--] <pathspec>…​
要するに
git checkout コミットID パス名
では作業ツリーの特定のファイルを特定のコミットの状態に切り替えることができる

「.」の意味

つまるところこれはパス名である。それだけ。
例えば「*.cs」で拡張子がcsのファイルだけが対象になる。
「.」は「*.*」の略かな
全ファイルが対象ってこと。
拡張子がないファイルも対象になる。

「--」の意味

これはcheckoutコマンドのオプションである。
[コミットID]と[パス名]の間に「--」を使って区切っても良い
なぜ必要なのかというとブランチ間の切り替えもcheckoutだからである。
ブランチ名として「master」があるのにファイル名としても「master」があるとき
git checkout master
というコマンドはmasterブランチへの切り替えとして機能してしまう
masterというファイルだけをもとの状態にしたいときには
git checkout -- master
とする。
無論HEADを省略しているから問題になるのであって
git checkout HEAD master
とすれば「--」がなくても「master」というファイルは元の状態にもどる。

参考

公式リファレンス
https://git-scm.com/docs/git-checkout