ししちにじゅうはち 4x7=28

よんたったー https://twitter.com/keita44_f4

俺がgithubを使うにあたってgitを理解しようとした話2

追記:
bleisさんによると「HEADはなんらかの参照を指すもので、コミットそのもを指すものではない」との指摘をいただきました。
図ではコミットを指していますが正しくはコミットのポインタを指します。
ただし、図の修正がめんどい*1のでご了承ください。

追記その2:
すばらしい図解をされているサイトを発見したので掲載させていただきます。コミットとコミットのポインタとHEADの位置などが参考になるだけでなく、各コマンドについてを図でひじょうにわかりやすく説明してくれています。
図解 Git


git話2回目。
hgを使っていた経験からpullやpushなど基本の意味はわかる。
しかしgitを使っていると概念の違いや謎のワードがたくさん出てくる。
今日はそれについても書き留めとく。

gitのポインタ

gitはコミットのポインタとして親コミットを指している。
よって図のように、各コミットの表す矢印はコミットの時系列と逆向きになる。*2
図はA→B→Cと変更していき、途中のBからbranchを作った状態。

HEADって何

今、手元のファイルがどこのコミットにいるのかを示す。
例えば上図だとCのポイントが現在のgitの状態。
もちろんそこから変更点があれば`git status`や`git diff`で確認できる。

HEAD^とかHEAD~って何者

HEADからコミットのポインタをいくつか辿った状態。
HEADはHEADポインタが指すそのもの。
HEAD^やHEAD~はHEADからポインタを1個辿ったもの。
HEAD^^は2個辿ったもの。。。。以下続く。
例えば上図の状態で`git checkout HEAD^`を行うと下図のような状態にHEADが移動し、ファイルを古い状態に戻すことができる。

masterって何

branchの1つでメインブランチに付けられる名前。
ブランチ名なのでcheckoutやpush・pullなどで指定ができる。
たとえばmasterブランチだけをとあるGithubレポジトリにpushしたければ、以下のようなコマンドになる。

$ git push git@github.com:hoge/fuga.git master 

branchって何

枝分かれ。
途中で違った変更を行いたいときに支流として存在する変更点。
`git branch `で指定した名前のブランチが作れる。
`git branch`で現存のブランチの一覧を確認できる。
`git branch -d `でブランチを削除できる。
もちろん、`git chekcout `で指定のブランチへ移動できる。
例えば`git checkout branch_name`をすると、下図のようにHEADが移動する。

まとめ

  • git checkout で特定のブランチへ
  • git branch
    • ブランチの一覧表示
    • でブランチの作成
    • -d でブランチの削除
  • HEADは現在の状態を指すポインタ
  • この程度のことすらわからないgit力に絶望した!

*1:もとい元の図を消してしまった

*2:人間は変更点を管理したいのに、変更点と逆向きのコミットのポインタを意識して操作しなくてはならないところが気に食わない