危险! 分离头指针

> 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)

detached HEAD

通常,我们工作在某一个分支上,比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的,每做一次提交,这两个指针就会一起向前挪一步。但是在某种情况下(例如 checkout 了某个具体的 commit),master 指针 和 HEAD 指针这种「绑定」的状态就被打破了,变成了分离头指针状态。我那天遇到的情况是,master 和 HEAD 指针看上去指在同一个 commit 上,但其实已经处在分离头指针状态。当我在此时又做了一次新的提交时,HEAD 指针跑到 master 指针前面去了。如果我直接检出 master 分支,HEAD 指针就会回退一格到 master 指针的位置,而最新的那次提交就变成了孤立的提交,没有任何分支能追踪到它,刚才的活白干了。

吃一堑长一智,下面是解决办法:

1
2
3
4
# 强制将 master 分支指向当前头指针的位置
git branch -f master HEAD
# 检出 master 分支
git checkout master