前往大师,但仍然超脱?

时间:2019-09-05 20:16:47

标签: git version-control git-checkout git-reset

说我有一个包含三个提交的Git存储库:

$ git log --oneline
62fa462 (HEAD, master) Third commit
76f2df9 Second commit
c05b82a First commit

现在,我不小心使用checkoutHEAD移至第二个提交:

$ 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分支,对吗?至少在一切正常时,日志看起来就像刚开始时一样。

这是怎么回事?

1 个答案:

答案 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时,您将失去对它的跟踪。