Edited at

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

More than 1 year has passed since last update.

知らずに使ってた【git checkout HEAD -- . 】の

「--」ハイフンハイフンと「.」ドットの意味


git checkout HEAD -- .

むかしむかし作業したファイルを元の状態に戻す魔法の呪文として教わった

git checkout HEAD -- .

git checkout -- .

git checkout HEAD .

git checkout .

どれも似たような挙動をして作業前の状態に戻してくれる

「--」と「.」ってなんぞや


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