At the source of every error which is blamed on the computer you will find at least two human errors, including the error of blaming it on the computer.
我的博客是 Hexo 生成的靜態網站,文章內容用 Git 作版本控制。前幾天在一次提交之后,發現提交的內容不見了,到底發生了什么?
案件回放
當時我認為自己正處在 master
分支上,編輯提交后隨手查看了一下 git log
,發現 master
分支指針仍指在前一次提交上,并沒有前進。這是我第一次碰到這種情況,當我發現有些不對勁的時候,我無知地直接檢出了 master
分支。于是剛剛提交的改動都消失不見了,從 log 里也找不到那次提交的痕跡。這也要怪 Magit! 沒有給我任何警告,倒是命令行下的 git 給出一行提示:我處于分離頭指針狀態。
分離頭指針(detached HEAD)
通常,我們工作在某一個分支上,比如 master 分支。這個時候 master 指針和 HEAD 指針是一起前進的,每做一次提交,這兩個指針就會一起向前挪一步。但是在某種情況下(例如 checkout 了某個具體的 commit),master 指針 和 HEAD 指針這種「綁定」的狀態就被打破了,變成了分離頭指針狀態。我那天遇到的情況是,master 和 HEAD 指針看上去指在同一個 commit 上,但其實已經處在分離頭指針狀態。當我在此時又做了一次新的提交時,HEAD 指針跑到 master 指針前面去了。如果我直接檢出 master 分支,HEAD 指針就會回退一格到 master 指針的位置,而最新的那次提交就變成了孤立的提交,沒有任何分支能追蹤到它,剛才的活白干了。
吃一塹長一智,下面是解決辦法:
# 強制將 master 分支指向當前頭指針的位置
$ git branch -f master HEAD
# 檢出 master 分支
$ git checkout master