Help us understand the problem. What is going on with this article?

知らずに使ってた【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 .
どれも似たような挙動をして作業前の状態に戻してくれる
「--」と「.」ってなんぞや: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

wagase
誰ひとりきみの代わりはいないけど上位互換が出回っている。 Twitterフォローされると喜びます。
https://twitter.com/wagase
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away