危险!分离头指针

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 指针的位置,而最新的那次提交就变成了孤立的提交,没有任何分支能追踪到它,刚才的活白干了。

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

# 强制将 master 分支指向当前头指针的位置
$ git branch -f master HEAD
# 检出 master 分支
$ git checkout master
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,752评论 1 17
  • 每个人应该去尝试不同的挑战,今天就迈开脚步,向前冲吧!毕竟前行的路上有人与我作伴!加油!
    暖暖的羊羊阅读 238评论 0 0
  • 拍摄地点:洛阳周山森林公园 后期处理:Snapseed
    木本思杨阅读 503评论 6 3
  • 写下这篇日志前,在朋友圈看到了一张图,我大学最好的朋友之一,梦黎晒了一张拍婚纱照的图片。我的这位同学,上大学时,一...
    柠檬安然阅读 202评论 0 0