HEAD detached at origin/xxx’ 的解决方案

754 阅读3分钟

1、今天输入git pull后出现了一下的问题

image.png

2、HEAD通常指向的是一个命名分支(例如master),与此同时,每个分支都指向一个特定的提交,git checkout 本质上是修改HEAD里面的内容来让它指向不同分支的。HEAD文件指向的分支就是我们当前的分支,当git checkout ,它意味着指向了某次特定的提交,那么此时你的这个分支当前已经处于游离状态了(detached HEAD), HEAD 指向可通过 cat .git/HEAD 查看,以下简单介绍一下:

分支master下有三个提交,其中一个打标签v2.0。

image.png

在这种状态下创建新的提交,分支将更新以引用最新的提交,具体而言,git commit创建一个新的commit d,其父节点为commit c,然后更新分支master来引用新的 commit d。HEAD仍然是指向分支master,因此现在间接指的是commit d。

image.png

能当签出一个分支下的不在顶端(tip)的提交(如:git checkout b),或者甚至创建一个未被命名分支引用的新提交,以下为签出b的情况,无论使用哪种checkout命令,HEAD现在都直接指向commit b,这被称为处于分离HEAD状态。这表示HEAD指的是特定的提交,而不是命名分支。分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名!!!

image.png

当我们在commit b上创建一个提交commit e时,实际上我们可以执行所有正常的Git操作

image.png

签出master分支时:

image.png

此时没有任何的引用指向commit f,最终commit f(以及扩展的commit e)将被例行的Git垃圾收集进程删除掉,除非我们在离开commit f之前,创建一个指向commit f的引用。如果尚未离开commit f,下面命令中的任何一个都将创建对它的引用:

git checkout -b foo

git branch foo

git tag foo

如果我们离开了commit f,那么我们必须首先恢复其对象名称(通常使用git reflog),然后才能创建对其的引用:

git reflog -2 HEAD # or

git log -g -2 HEAD

该部分内容引用自:

https://blog.csdn.net/ystyaoshengting/article/details/104074499

https://blog.csdn.net/weixin_46065591/article/details/125012292?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125012292-blog-125793091.t5_layer_targeting_s&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125012292-blog-125793091.t5_layer_targeting_s&utm_relevant_index=1

3、实例:

(1)git branch -v

image.png

(2)git checkout 496629c

image.png

(3)git checkout 其他分支

后续的提交是无法可见保存的,一旦切到别的分支,游离状态以后的提交就不可追溯了,因而触发git的保护机制, 出现问题,无法切换分支。

image.png (3)git branch

此处我们假设最后的提交为496629c

image.png

解决方法:

(4)查看在游离状态下提交的最新commit号:git barnch -v

image.png

(5)创建一个临时的新分支:git branch temp 496629c

(6)切换到要合并的分支上:git checkout release-dev

(7)合并分支:git merge temp

(8)删除临时的分支:git branch -d temp

(9)查看分支git branch

image.png