detached HEAD切换分支代码丢失

今天在切换git分支的时候,代码丢失,找了半天,恢复不了,瞬间慌了,还好我提交过,首先要知道,所有提交过的代码,都是可以被找回的。
但是git log并没有我的提交记录,我更慌了。下面把踩的坑总结下来

先来说说,从detached HEAD分支切换到其他分支,导致代码丢失的解决办法。每个人造成这种问题的原因,可能不尽相同,但是解决办法确实通用的

解决办法:

1、执行git reflog可以看到提交记录
在这里插入图片描述
2、git checkout 0f3341b

3、git checkout -b temp 创建temp 分支,并切换到该temp 分支
4、git checkout master 切换到master分支
5、git merge temp 合并temp分支

git checkout 到 某个分支,切换后发现并没有切换到该分支,而是切到了该分支的最新节点,无论如何都回不到分支头,记录这个问题。

HEAD基本和detached 状态

1.HEAD基础
git checkout 实际上是修改HEAD文件的内容,让其指向不同的branch。

HEAD文件指向的branch就是当前branch.

一般来讲,HEAD的内容是指向staging(暂存区)的master文件的。

ref: refs/heads/master

2.detached HEAD
如果让HEAD文件指向一个commit id,那就变成了detached HEAD。git checkout 可以达到这个效果,用下面的命令:

git checkout 1aea8d9

laea8d9是一次提交的commit id,这样HEAD就会指向这个提交。

$ git checkout 89f8dae^
Note: checking out '89f8dae^'.

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 performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 1aea8d9... add test file x

命令:

git checkout origin/分支名

结果:

HEAD is now at 3691a4a5f 节点信息
(HEAD detached at origin/分支名)

解析:
1 detached HEAD state指的是什么
正常情况下,HEAD指向一个branch,而branch又指向一个commit。

detached HEAD state指的是HEAD指针没有指向任何的branch,而是指向了一个commit。

2 detached HEAD state时我能做什么
我也可以提交,这个时候,commit链就在git checkout这个commit的基础上展开,但是如果直接离开到一个branch上的话,这些commits就会被当成garbage,被git garbage collection routine所回收。但是,我们也可以保留这些commits,又下面三种方式:

$ git checkout -b foo ,创建一个branch指向这个commit链,然后HEAD指向这个branch,于是HEAD就不是处于detached state。
$ git branch foo,创建一个branch指向这个commit链,但是HEAD还是处于detached state。
$ git tag foo,创建一个tag指向这个commit链,HEAD还是处于detached state。

3 为什么git checkout origin/XXX远程分支的时候会让HEAD进入detached state
因为HEAD不能指向远程分支,它只能指向本地的某个commit或者本地分支。当"git checkout 远程分支",而本地又没有这个分支,HEAD就会直接指向远程分支指向的commit了,HEAD指向commit就会进入detached HEAD state。

这个时候可以

git checkout -b 分支名

HEAD就恢复正常,并且local brach web-zach就会跟踪远程分支origin/分支名

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值