Git出现HEAD detached from XXX的解决方法

前言

为了防止 Hexo 相关配置丢失,我使用 Git 对其进行管理,每次进行什么配置都进行一次提交,这样就不用担心以后配置出错导致博客无法使用。

问题起因

在几天前,因为对博客进行了一些配置但是没有起到效果,所以我进行了回退,但是在使用命令时,不是使用的 reset

1
$ git reset --hard 25d7078

而是使用的 checkout ,唉,好久没用,回退命令都记错了

1
$ git checkout 25d7078

回退成是成功了(我认为),但是隐患却也留了下来,而本人却不自知。

出现问题

几天后,我又一次的对博客配置进行了修改,测试没有问题以后,进行了提交,然后推送到服务器

1
2
3
$ git add .
$ git commit -m "添加了对静态文件的压缩配置"
$ git push origin master

但是返回的结果却是

1
Everything up-to-date

嗯?修改了一大堆文件你给我说没有新数据?逗我呢?赶紧上远程仓库查看,新修改确实没有推送进来。

是哪儿出了问题?查看下状态

1
$ git status

问题出现,显示

1
HEAD detached from XXX

赶紧到网上查查资料

查询资料

经过查找,成功找到解决方案,有篇博客对这个问题进行了详细的解释,说的比较详细。有兴趣的可以看看

https://blog.csdn.net/u011240877/article/details/76273335

问题所在

通过上面的文章知道, git checkout 25d7078 这种通过提交ID进行回退,HEAD就处于了游离状态,这个状态下历史版本之间互相切换非常方便,但是!!!在这个状态上提交的操作都会开一个匿名分支。这个匿名分支没法保存。

你要是在游离状态进行了修改操作,你的提交无法保存,要是你又不小心跳到了其他的分支,那么你完了,东西没了,也无法追溯找回。

解决办法

我不仅执行了 git checkout 25d7078 ,而且还进行了大量的修改,怎么办,还有救吗?

答案是:只要你还没有跳到其它分支,那么还有救。

刚进行了提交,但是推送没反应,别急,按如下步奏做,东西都还在。

  1. 先创建一个分支 temp ,用于保存现在提交的代码,这样,你的修改就保存在了 temp 分支上了

    1
    $ git branch temp
  2. 接下来跳回你要回到的那个分支,我的是要回到 master 分支

    1
    $ git checkout master
  3. 然后将 temp 分支合并到 master 分支,这样,刚才提交的东西,就拿过来了

    1
    $ git merge temp
  4. 合并之后,查看下状态,查看下代码,有冲突就解决掉,没有更好

    1
    $ git status
  5. 检查修改的东西是不是都回来了,没有问题了,就可以把刚才创建的 temp 分支删除了,然后将修改推送到远程仓库

    1
    2
    $ git checkout -d temp
    $ git push origin master

至此,问题解决