【问题标题】:Head at master but still detached?向大师走去,但仍然超然?
【发布时间】:2020-01-08 18:25:08
【问题描述】:

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

这里出了什么问题?

【问题讨论】:

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


    【解决方案1】:

    分离的 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 时就会忘记它。

    【讨论】:

    • 啊,很有道理。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2020-12-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多