結論
ブランチ
は特定の「一つのコミット」を指すHEAD
は特定の「一つのコミット」を指すgit checkout
はHEAD
を移動させるコマンド- 移動先は指定された「一つのコミット」になる
git checkout
の引数に「ブランチ名」を指定するということは、結局は「一つのコミット」を指定することにすぎないということ*1
- 移動先は指定された「一つのコミット」になる
誤解しやすい点
- 「
ブランチ
」を、ある「ツリー(=複数のコミットの集合)」ととらえるのは誤り HEAD
を移動させるとその時点でHEAD
はどのブランチにも属さなくなる(いわゆるdetached HEAD
状態)detached HEAD
の状態から、HEAD
をブランチに属させる方法は以下のとおりgit checkout 現存するブランチ名
を実行するgit branch 新しいブランチ名
を実行して今のHEAD
の場所に新しいブランチを作る- ※ 単に
git checkout コミットのハッシュ
でHEAD
を移動させるだけでは、ブランチに属させることはできない
参考ページ
detached HEAD
についてと、そこからの復旧については西尾さんのページがわかりやすいですブランチ
やHEAD
が「一つのコミットを指す」ことについては teratail が参考になります
余談
多くの記事で、常に「ブランチ
が指すコミット」=「HEAD
が指すコミット」という前提があるため*2、例えば git checkout HEAD~1
をした際の「ブランチ
」や「HEAD
」の状態の理解がしにくいと思い、今回の記事を書きました。