以主人为首但仍然超然?

Head at master but still detached?

假设我有一个包含三个提交的 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 分支,对吧?至少日志看起来和开始时一切正常时一模一样。

这里出了什么问题?

分离的 HEAD 意味着 HEAD 不是 link 到 b运行ch 的头部。 b运行ch head 始终是对提交的引用。另一方面,HEAD 是对提交或 b运行ch 头的引用。

开始的时候,HEAD特指master不是62fa462;从图形上看,它看起来像

62fa462 <----- master <---- HEAD
   |
   v
76f2df9
   |
   v
c05b82a

签出后,HEAD 不再引用 b运行ch 头,而是直接提交; 这就是超脱的意思

$ git checkout 76f2df9


62fa462 <-+-- master
   |
   v
76f2df9 <----- HEAD
   |
   v
c05b82a

当你运行reset时,你没有查看b运行chmaster;您检查了 master 引用的提交:

62fa462 <-+-- master
   |       \-- HEAD
   v
76f2df9
   |
   v
c05b82a

只有当你有一个 b运行ch 签出时,b运行ch head 才能被新提交推进;否则,只有 HEAD 引用新的提交,下次你 运行 git checkout.

时你会忘记它