在有一次使用git时,我提交commit后,并未push,然后直接切到了当前分支的某个tag,最后我想切回来的时候,竟然找不到我刚才提交commit的节点了…
关联篇
- Git指南 - 你该掌握的那些基础认知和首次配置
- Git指南 - 项目实战中天天用的那些基础命令
- Git指南 - 通过规范使用Git来证明你是一个牛牛
- Git指南 - 我经常遇到的那些项目实战场景
- Git项目实战 - 我遇到的那些Git问题是这么解决的
- Git指南 - 刚提的commit 怎么找不到了(游离分支)?
小步阑珊,应好过固步不前
- 问题场景
- 解决方式
- 游离分支
问题场景
具体有以下几步:
本地提交 commit 未 push
切换tag 或 分支
最后无法找到之前的commit节点,导致切不回最新的代码
解决方式
这种解决方式在我看来属于曲线救国,如果以后有更好的,我应该会再来补充
步骤1:通过 git reflog
查看当前分支的所有提交记录(惯性思维可能会直接用git log
,并不适用于当前场景)
步骤2:找到 commit
记录,基本就解决了一半问题; 接下来,新建分支,回滚代码
- 上图 标红区域为 操作
git
后的hash
值 ,都是唯一
的(我们需要切换到哪个节点,就需要用到对应节点的hash
值) - 新建一条临时分支,用于存储最新节点最新代码
新建临时分支(一般会直接切换新建的分支)
git checkout -b "tmpLiu"
就在临时分支中 git reset --hard 最新commit hash值
git reset --hard e795...
步骤3:切换回之前的分支,合并临时分支(合并完成后,可删除临时分支)
切换分支
git checkout 之前分支
合并分支
git merge tmpLiu
Hint:下方的游离分支同该处的解决方式基本相同,只是多了一些示例,有不懂的话也可以去看看
最终解决
游离分支
在解决问题中 和 解决问题之后,我才发现原来这种操作涉及到游离分支的一些相关知识;
head指针处于游离状态,需要建立一个分支然后将它合并到master分支,最后删除那个临时分支即可。
别人遇到的场景同我稍有不同,是在提交代码时 git push xxx xxx
报错,但是解决方式相同,具体如下
git push origin dev
,报错:error: src refspec dev does not match any
从图中可以看出当前在 HEAD detached from origin/dev
分支下,此为游离分支,是匿名的
解决方式
- 查看在游离状态下提交的
最新commit号
:执行git reflog
命令或者执行git branch -v
命令,两者其一即可
git reflog
git branch -v
可以看到最新commit号是:8708fbb(如果自我感觉 git branch -v 显示不全的话,可以直接用 git reflog
)
- 创建一个临时的分支,创建完成之后切换到该分支上查看一下
git branch temp 最新的commit号
//示例: git branch temp 8708fbb
- 切换到要合并的分支上
git checkout 要合并临时分支的分支名称
//示例: git checkout dev
- 合并分支
git merge temp
- 删除临时分支
git branch -d temp
- 推送合并后的分支到远程仓库
git push origin 分支名称:远程分支名称
//示例: git push origin dev
- 最后就不放图了,你可以在当前分支,直接
通过 log 查看最终结果