#author("2021-05-04T22:24:19+09:00","default:ryuichi","ryuichi")
* symref - シンボリック参照 [#d7a67911]
#author("2021-05-05T03:30:43+09:00","default:ryuichi","ryuichi")
* HEAD ORIG_HEAD他 [#f9a691b1]
** symref - シンボリック参照 [#y80d7989]
- HEAD
- ORIG_HEAD
- FETCH_HEAD
- MERGE_HEAD
** HEAD [#p0ddc5de]
#shell(){{
$ cat .git/HEAD (1)
ref: refs/heads/master
$ cat .git/refs/heads/master (2)
abc1234a8cb02bb47d9901ba2
}}
- (1) .git/HEADはカレントブランチのref(ここではmasterブランチであり、その実態は.git/refs/heads/masterというファイル)を参照している
- (2) 次に.git/refs/heads/masterはコミットID abc123を参照している
- すなわち、ここではHEADとmasterブランチとabc123は同じであり、'''git reset abc123'''と'''git reset master'''と'''git reset HEAD'''は同じ結果になるる
** ORIG_HEAD [#p9670707]
#shell(){{
$ git log --oneline (1)
abc1234 (HEAD, master) message2
def7890 message1
$ ls .git/ | grep HEAD (2)
HEAD
$ git reset HEAD^ (3)
$ ls .git/ | grep HEAD
HEAD
ORIG_HEAD
$ cat .git/ORIG_HEAD
abc1234...
$ git co ORIG_HEAD (4)
}}
- (1) 2つコミットがある状態で、最新がabc1234、その前がdef7890とする
- (2) 最初はORIG_HEADファイルは存在しない
- (3) git resetを実行して始めてORIG_HEADが作成される
-- git reset HEAD^は一般的には最新のコミットを削除して1つ前に戻る意図で使われるコマンドであり、下で言うHEADをdrasticにmoveしてることに相当するから
-- なお、git reset HEAD^以外にgit merge masterでもORIG_FILEができる。git checkout HEAD^ではORIG_HEADはできない
- (4) 上の(3)の時点で(事前にabc1234というコミットIDをメモしておかない限り)コミットabc1234は到達不能であるが、ORIG_HEADをを指定すれば到達することができる
> ''ORIG_HEAD is created by commands that move your HEAD in a drastic way, to record the position of the HEAD before their operation, so that you can easily change the tip of the branch back to the state before you ran them.'' https://git-scm.com/docs/gitrevisions
*** 参考 [#o5faa630]
https://stackoverflow.com/questions/964876/head-and-orig-head-in-git