過去メモ整理中。多分内容は正しいはず。
[ 参考 ]
http://kozy4324.github.io/blog/2013/03/09/git-ref/
http://d.hatena.ne.jp/hokaccha/20120404/1333507076
GIT と ハッシュ
GITはリビジョン管理をコミットのハッシュ番号で整理します。
4dda3528d5765aae856f8158e14e6ee217f05e24
みたいなあれです。指定するときは長いので先頭7文字とかで使ったりします。
GITにはハッシュの他にも、シンボリック参照というのがあったりします。
$ git log 4dda352 # 4dda352までのログを表示
$ git log HEAD # HEADまでのログを表示
$ git log dev # devブランチのログを表示
GITがシンボリック参照を追う流れ
GITは指定されたシンボリック参照に対して以下の順で追跡を行います。
- ファイル .git/ が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
- ファイル refs/ が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
- ファイル refs/tags/ が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
- ファイル refs/heads/ が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
- ファイル refs/remotes/ が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
- ファイル refs/remotes//HEAD が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
これらのファイルはGITでの諸操作の際に自動的に生成され、対応するハッシュ値が書き込まれます。
.git/
主に以下の様なファイルが該当します。
- HEAD
- FETCH_HEAD
- ORIG_HEAD
- MERGE_HEAD
- CHERRY_PICK_HEAD
自分で作成した場合には、そこに参照を維持することも可能です。
$ cp .git/HEAD .git/MY_HEAD
$ git log MY_HEAD
.git/refs/tags/
タグ作成で登録されるディレクトリ
.git/heads/
ブランチ作成で登録されるディレクトリ
.git/remotes/
リモート登録で登録されるディレクトリ
シンボリック参照の中身を確認する。
シンボリック参照がどのハッシュ値として解釈されるのかを確認する場合、
ファイルを探してcatする、という手もありますがrev-parse
コマンドを使うと便利です。
$ git rev-parse master # masterでの解釈
$ git rev-parse heads/master # ブランチmasterの解釈
$ git rev-parse remotes/origin/master # リモートoriginのmaster
例えばシンボリックのmasterは通常ブランチmasterを意味しますが、
masterという名前のタグを作成した場合、そちらの参照が優先される事になります。
参照が実際に何を指しているのかを確認する場合に、rev-parse
は非常に役立ちます。
おわり
他にも参照名に^n
などとつけてn個前の参照をたどる、など、GITには色々と便利なシンボリック参照が用意されれいます。
もっと知りたい、という人は
https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
あたりをご確認ください。