侧边栏壁纸
  • 累计撰写 90 篇文章
  • 累计创建 95 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

Git中detached HEAD状态

汤圆学Java
2022-09-05 / 0 评论 / 0 点赞 / 45 阅读 / 2,821 字
温馨提示:
本文最后更新于 2022-09-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

作者:汤圆学Java
个人博客:http://www.javalover.cc

前言

有时候,我们在使用git时,可能会碰到detached HEAD这样的提示信息;

这里我们首先要明白一点,这个提示信息只是一个提示,并非是错误警告,所以不必惊慌;

下面我们就重现下这个提示信息,以及如何去处理;

如果只是想快速地恢复到正常状态,那么直接执行git switch branch切回到之前的分支即可,就当一切都没发生过;

目录

  1. detached HEAD介绍
  2. 如何正确使用detached HEAD
  3. 关闭detached HEAD提示

正文

1. detached HEAD介绍

从名字上来看,意思是"分离的HEAD节点",而我们平时正常操作时,HEAD都是处于未分离的状态;

分离意思就是:当前的状态处于跟所有分支都没有关系的状态,在分离状态下进行的所有操作(包括更新和提交)都不会被记录到任何分支中;

下面我们通过实际例子来复现下"分离的HEAD节点"

我们知道,一般情况下,HEAD指向的都是我们正在访问的分支的最新节点,比如下面的例子:

image-20220526160324751

这里提交了三次,最新的节点为db988,就是HEAD指向的分支节点;

下面我们修改一下HEAD,使其指向190aa节点,如下所示:git checkout 190aa

git checkout 多用来切换分支,如果用来切换节点,那么就会出现detached HEAD状态;

PS D:\server> git checkout 190aa
Note: switching to '190aa'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

可以看到,出现了detached HEAD提示,此时HEAD节点为分离状态,如下所示;

image-20220526170823961

根据终端提示可以明白,在这个状态下进行的任何操作都不会影响其他分支;

需要注意的是:

  • 这里的git checkout commitid,跟之前我们学过的 git reset重置操作 很像,都是改变HEAD的指向;

  • 不同的是,这里的git checkout commitid执行之后,commitid后面的节点还是存在的(比如上面的db988节点),只是在当前分离状态下访问不到(需要切换到原来的分支访问);而git reset commitid之后,commitid后面的节点就不存在了,被删除了(不过你要是记得节点的id,还是可以恢复);

2. 如何正确使用detached HEAD

可以用来检查历史提交的记录有没有问题;

  • 比如我们想要检查前一次提交的记录,那么就可以通过git checkout previous_commitid,切换到指定的记录进行排查;
PS D:\server> git checkout 190aa
Note: switching to '190aa'.

此时查看仓库状态git status,会发现如下提示 :

image-20220526173042095

这个就是说当前仓库处于HEAD分离状态,因为我们已经知道了这个状态是如何生成的,所以可以忽略这个红色提示;

  • 排查之后,如果发现有问题,可以直接进行修改,然后提交 git commit -a -m "发现bug,已修复"
PS D:\server> git commit -a -m "发现bug,已修复"
[detached HEAD 0ba40ae] 发现bug,已修复
 1 file changed, 3 insertions(+), 1 deletion(-)

此时的仓库记录如下所示:

image-20220526174126811

提交后要怎么保存这个记录呢?

因为前面说了,分离HEAD状态下,提交的记录不会影响其他分支,即跟其他分支都是没有关系的;

我们可以通过git branch查看分支信息:

PS D:\SpringBootProject\ronghuitong\scm-server> git branch
* (HEAD detached from 190aaa7)
  master

可以看到,当前的分离状态只是一个状态,不存在于任何分支之中;

  • 这就需要我们创建一个新的分支git branch detach-test,并切换到新的分支git switch detach-test,如下所示:
PS D:\server> git branch detach-test
PS D:\server> git switch detach-test
Switched to branch 'detach-test'
PS D:\server> git branch
* detach-test
  master

可以看到,之前的分离状态没了,多了一个新的detach-test分支,我们刚才的修改都记录在这个分支里;

后续如果需要,我们就可以把这个分支合并到原有分支;

3. 关闭detached HEAD提示

如果我们已经了解了detached HEAD是个什么东西,那么我们就可以放心地把这个提示关闭掉;

毕竟每次提示的都是你所知道的内容,是比较繁琐的;

我们可以通过git config --global advice.detached head false

–global意思是关闭所有Git项目的分离提示,如果不加,则只是关闭当前的Git项目

此时我们再运行git checkout previous-commitid,就不会出现分离提示了:

PS D:\server> git checkout 190aa                   
HEAD is now at 190aaa7 2

总结

  1. detached HEAD是一个温馨提示,意思是当前HEAD处于分离状态,跟任何分支都没关系

  2. 如果是误操作导致的这个状态,那么可以通过git switch branch快速切回到之前的分支,分离状态也会随即消失;

  3. 如果想通过detached HEAD分离状态来修改前面的提交,那么可以进行如下操作:

    1. 切换到旧的提交:git checkout commitid
    2. 修改bug,并提交记录:git commit -a -m "修复bug"
    3. 创建新分支:git branch detach-branch
    4. 合并到原有分支:git switch master && git merge detach-branch
  4. 关闭detached HEADgit config --global advice.detached head false,前提是你清楚地知道你关闭了啥

参考

0

评论区