自分がGitを理解しようとしたとき、ブランチがわからずに躓いたのでそういう人のために。
ブランチイメージ図
ブランチ≠作業フォルダ
『ブランチを切り替える』という言い方から、ブランチを作業フォルダだと誤解する人がいる。
ブランチを切り替えた時にローカルのgitフォルダに現れるのは『ブランチが貼られたコミットの中身』である。
Gitはブランチという言葉を2つの意味で使っている。
- ブランチの作成、削除:『ブランチ=ブランチ』
- ブランチを切り替える:『ブランチ=ブランチが示すコミット』
コミットに複数のブランチを付けられる訳
ブランチはただの付箋のため、いくらでも付けたり消したりできる。
スタッシュが必要な訳
『ブランチ≠作業フォルダ』のため、gitはローカルの変更をブランチに保持させることができない。
別ブランチを選択するとき、ローカルコードが変更されていると別ブランチが選択できないのはそのためである。
そのため、ローカルの変更を一時退避させるためにスタッシュが存在する。
コミットをしたときに起きること
下記の手順でコミットが作成される
1.現在のコミットの一つ先に新しいコミットが作成される。
2.現在選択中のブランチ(付箋)が新しいコミットへ貼りなおされる。
ブランチの中身が修正されたのではなく、修正したコードを含む新しいコミットにブランチが貼りなおされている。
ブランチ機能は後付け機能?(完全な推測なのでご注意ください。)
人間が使う分においてブランチ機能は必須なのだが、gitのシステムから見るとブランチは必ずしも必要ではない。
そして、コミットの変更はgitは許していないのにブランチの変更はほとんど制約がない。
特にコミットメッセージすら変更を許さないにもかかわらずブランチはいくらでも変更できるのはちょっと不自然。
そう考えると、gitのブランチ機能が後付けなのは信憑性がある気がする。
もし後付けだった場合、gitの開発者はブランチ機能をどのタイミングで思いついたのか?最初から思いついていたのであれば本当に天才だと思う。