背景
誤ってdevelopにまだレビュー前のコードをコミットした。
その際、下記を行った。
git reset --hard コミットハッシュ
しかし、コミットハッシュを指定して、developブランチが元に戻る、とは何が起きているのか??と疑問が生じたため、gitの深いところが理解したくなった。
追記:featureにcheckoutしている状態で誤)のコードを実行したことにより、
featureにdevelopをマージするつもりが、
developにfeatureがマージされてしまった。
なぜ(誤)のコードで上記が起きたのかは理由がわからない。
正)git push origin develop
↓
誤)git push develop
目的
今まで雰囲気で使用していたgitを、より何が起きているか理解し、コマンドをより安心して使用できるようにしたい。
本文
- gitには2つが存在する
- gitオブジェクト:blob,tree,commit,tag
- gitオブジェクトはイミュータブルで追加されていくのみ
- リファレンス:branch,head,tag
- ポストイットみたいなもので、ハッシュ値を参照する
- gitオブジェクト:blob,tree,commit,tag
- イメージ的には、非巡回グラフ(gitオブジェクト)が作成されて、ポストイット(リファレンス)がついている
- HEAD
- 現在チェックアウトしているリファレンス(ブランチ)を指す
- 現在さし示しているコミットオブジェクトが、VSCODEの左側のコードの状態と同じ。
- マージ
- fast-forward:リファレンスが動くだけ
- non-fast-forward:新しいコミットオブジェクトができてHEADもそこに動く。
- tag
- 軽量タグ:ハッシュ値のみ
- アノテートタグ:ハッシュ値+情報
学び
ブランチやHEADの理解がふんわりしていたがかなり明確になった。
次のステップ
gitを操作していく中で、上記を意識しながら操作する。
mergeやrebaseなどの動きもイメージできるように、再学習をする。