Git 中 HEAD 游离的原因与解决方法

Git 中 HEAD 游离的原因与解决方法

程序猿何大叔

什么是 HEAD

Git 中的 HEAD 可以理解为指针,指向当前仓库所处的分支。一般在有 Git 管理的目录下打开 Git 终端都能在当前路径的尾巴上,看到所处的分支名。

img

还可以在命令行中输入 cat .git/HEAD 查看当前 HEAD 指向哪里。

img

一般它指向当前工作目录所在分支的最新提交。

img

如何造成 HEAD 的游离状态

一般我们会使用命令 git checkout <branch_name> 来切换分支,HEAD 就会移动到指定的分支上。

img

但是,如果我们使用的是 git checkout <commit_id> 来切换到指定的某一次提交,HEAD 就会处于「detached」状态,也就是游离状态

img

HEAD 游离状态的利弊

好处:HEAD 处于游离状态时,开发者可以很方便地在历史版本之间互相切换,比如要回到某次提交,只需要 checkout 对应的 commit id 或者 tag 名即可。

弊端:若在该基础上进行了提交,则会新开一个「匿名分支」;也就是说我们的提交是无法可见保存的,一旦切换到别的分支,原游离状态以后的提交就不可追溯了。

img

实际情景

下面我们来看看实际的例子。

首先查看一下当前的分支情况,当前只有一个 master 分支:

img

再来查看下近期的 log 日志:

img

然后假设我要回到倒数第二条 commit 时候的状态,顺便查看下本地工作目录状态以及分支状态:

img

可以看到,我还没有修改和提交的情况下,切换完成就给我新建了一个分支,并且指明 HEAD 正游离在 2772886<commit id> 上。

img

如果不做任何修改,想回到 master 分支,直接 git checkout master 即可,而不要 checkout master 主干所对应的 <commit id>

img

顺利回到主干的话,HEAD 的游离状态会取消,原临时游离分支也会消失。

img

如果是在游离状态做了修改和提交,则:

img

切换会 master 分支时,在游离状态所做的修改和提交无法追溯:

img

如何解决

其实很简单,刚才有仔细看终端提示的同学就会知道,在切换到游离状态的时候应该新建一个分支,然后我们所有的操作修改和提交都会保存到该分支,HEAD 也就指向了该分支最新提交的 commit id 处,而不会再处于游离状态。

img

当在新建分支上修改提交完毕时,就切换回 master 分支,将原分支合并到 master 分支就万事大吉了。 到这里就不再操作演示了,大家都懂。

参考链接

部分图片摘自《图解Git》: marklodato.github.io/visual-git-…

文章参考《Git 手册》: git-scm.com/docs/git-ch…

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值