git checkout badcafeってやらない方がいいよ

git checkout badcafe
git checkout -b badcafe
のようなことはやらない方がいいよ、というお話です。
(ここでbadcafeとは任意のコミットハッシュ値のことだと思ってください)

結論

コミットハッシュを指定してチェックアウトしたいなら、
git checkout -b tmp badcafe
のようにやるのがよい。
なんでもいいから一時的な新ブランチ(tmpとか)を作ってそこにチェックアウトするのがよい。

git checkout badcafeがなぜよくないのか

$ git checkout  badcafe
Note: checking out 'badcafe'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at badcafe... 
これはいわゆる 'detached HEAD'という状態で、HEADがどのブランチをも指してない状態です。
こうなると、追加コミットをすることができません。

まあこれだけならちょっと不便なだけで実害ないのですが、問題はうっかり "-b"オプションを付けてしまったときです。
$ git checkout -b badcafe
Switched to a new branch 'badcafe'
これはアカンやつです。
一見「"badcafe"コミットをもとにして"badcafe"ブランチを作った」ように見えるのだけどそうではないのです。
これは下記と等価です。
git branch badcafe HEAD
git checkout badcafe 
つまり、
ということです。

なので、checkoutするときはブランチ名を書いた方がよいでしょう。
(もちろん、裏側の挙動をちゃんと把握した上でやってるなら何をやってもいいと思いますが)

おまけ

ちなみにドキュメントなどで「任意のコミット」を表したいときに使える単語として、
badcafe
badbabe
deadbeaf
facefeed
などがあります。
他にも面白いのあったら教えてください。
カテゴリ:

人気記事