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 生成的靜態(tài)網(wǎng)站仅仆,文章內(nèi)容用 Git 作版本控制这揣。前幾天在一次提交之后,發(fā)現(xiàn)提交的內(nèi)容不見了舀武,到底發(fā)生了什么?
案件回放
當(dāng)時我認(rèn)為自己正處在 master
分支上衷旅,編輯提交后隨手查看了一下 git log
,發(fā)現(xiàn) master
分支指針仍指在前一次提交上茄袖,并沒有前進嘁锯。這是我第一次碰到這種情況家乘,當(dāng)我發(fā)現(xiàn)有些不對勁的時候,我無知地直接檢出了 master
分支耀找。于是剛剛提交的改動都消失不見了野芒,從 log 里也找不到那次提交的痕跡双炕。這也要怪 Magit! 沒有給我任何警告,倒是命令行下的 git 給出一行提示:我處于分離頭指針狀態(tài)摇锋。
分離頭指針(detached HEAD)
通常荸恕,我們工作在某一個分支上戚炫,比如 master 分支媳纬。這個時候 master 指針和 HEAD 指針是一起前進的,每做一次提交茅糜,這兩個指針就會一起向前挪一步蔑赘。但是在某種情況下(例如 checkout 了某個具體的 commit),master 指針 和 HEAD 指針這種「綁定」的狀態(tài)就被打破了缩赛,變成了分離頭指針狀態(tài)酥馍。我那天遇到的情況是,master 和 HEAD 指針看上去指在同一個 commit 上汁针,但其實已經(jīng)處在分離頭指針狀態(tài)。當(dāng)我在此時又做了一次新的提交時施无,HEAD 指針跑到 master 指針前面去了必孤。如果我直接檢出 master 分支猾骡,HEAD 指針就會回退一格到 master 指針的位置,而最新的那次提交就變成了孤立的提交隧魄,沒有任何分支能追蹤到它卓练,剛才的活白干了隘蝎。
吃一塹長一智购啄,下面是解決辦法:
# 強制將 master 分支指向當(dāng)前頭指針的位置
$ git branch -f master HEAD
# 檢出 master 分支
$ git checkout master