说我有一个包含三个提交的Git存储库:
$ git log --oneline
62fa462 (HEAD, master) Third commit
76f2df9 Second commit
c05b82a First commit
现在,我不小心使用checkout
将HEAD
移至第二个提交:
$ git checkout 76f2df9
Previous HEAD position was 62fa462 Third commit
HEAD is now at 76f2df9 Second commit
然后我想恢复以前的状态,所以我使用reset
:
$ git reset --hard 62fa462
HEAD is now at 62fa462 Third commit
这行得通,并且在日志中可以看到,HEAD
再次指向master
:
$ git log --oneline
62fa462 (HEAD, master) Third commit
76f2df9 Second commit
c05b82a First commit
但是,当我检查状态时,我得到:
$ git status
HEAD detached from 76f2df9
nothing to commit, working tree clean
我真的不明白,为什么HEAD
仍然很孤立?在日志中,它显示(HEAD, master)
,因此它应该指向master
分支,对吗?至少在一切正常时,日志看起来就像刚开始时一样。
这是怎么回事?
答案 0 :(得分:4)
分离的HEAD表示HEAD
不是分支头的链接。分支头始终是对提交的引用。另一方面,HEAD
是对提交或分支头的引用。
开始时,HEAD
是对master
的引用,不是 62fa462
;从图形上看,
62fa462 <----- master <---- HEAD
|
v
76f2df9
|
v
c05b82a
结帐后,HEAD
不再引用分支头,而是直接提交; 那是所谓的分离。
$ git checkout 76f2df9
62fa462 <-+-- master
|
v
76f2df9 <----- HEAD
|
v
c05b82a
运行reset
时,您没有签出分支master
;您签出了master
引用的提交:
62fa462 <-+-- master
| \-- HEAD
v
76f2df9
|
v
c05b82a
只有当您签出了 branch 时,分支头才能通过新的提交进行推进;否则,只有HEAD
会引用新的提交,下次运行git checkout
时,您将失去对它的跟踪。