Git における「ブランチ」「HEAD」の意味と「checkout」することの意味

結論

  • ブランチ は特定の「一つのコミット」を指す
  • HEAD は特定の「一つのコミット」を指す
  • git checkoutHEAD を移動させるコマンド
    • 移動先は指定された「一つのコミット」になる
      • git checkout の引数に「ブランチ名」を指定するということは、結局は「一つのコミット」を指定することにすぎないということ*1

誤解しやすい点

  • ブランチ」を、ある「ツリー(=複数のコミットの集合)」ととらえるのは誤り
  • HEAD を移動させるとその時点で HEAD はどのブランチにも属さなくなる(いわゆる detached HEAD 状態)
    • detached HEAD の状態から、HEAD をブランチに属させる方法は以下のとおり
      • git checkout 現存するブランチ名 を実行する
      • git branch 新しいブランチ名 を実行して今の HEAD の場所に新しいブランチを作る
      • ※ 単に git checkout コミットのハッシュHEAD を移動させるだけでは、ブランチに属させることはできない

参考ページ

余談

多くの記事で、常に「ブランチ が指すコミット」=「HEAD が指すコミット」という前提があるため*2、例えば git checkout HEAD~1 をした際の「ブランチ」や「HEAD」の状態の理解がしにくいと思い、今回の記事を書きました。

*1:git checkout HEAD~2 とか git checkout 3fa18eb22d5ee とかの内容と同じ、ということ

*2:いやまあ大抵の場合はそうでしょうが

Powered by はてなブログ