能否从GitHub的origin/master恢复本地分支未推送的提交?
嘿,我之前也碰到过类似的糟心事,先给你理清楚核心问题和解决办法:
本地提交是否存在于GitHub?
首先明确:只有当你之前把这些feature分支的提交push到过GitHub远程仓库时,它们才会存在于GitHub上。如果这些feature分支你从来没执行过git push origin feature-xxx,那这些提交只保存在原来的本地仓库里——要是原来的机器彻底挂了没法恢复数据,那这些提交大概率找不回来了。
但如果你确实push过,只是新克隆的仓库里没显示这些分支,那它们肯定还在GitHub上,只是你没拉取到本地而已。
找回提交的具体步骤
1. 先确认GitHub上的远程分支
首先在新克隆的仓库里,先拉取所有远程仓库的最新信息:
git fetch origin
然后查看所有远程分支:
git branch -r
这个命令会列出所有GitHub上存在的分支,比如origin/feature-your-branch-name。如果能看到你丢失的feature分支对应的远程分支,那接下来就简单了。
2. 将远程分支拉到本地
如果找到了目标远程分支,直接切换到该分支即可(Git会自动在本地创建对应的分支并跟踪远程分支):
git checkout feature-your-branch-name
或者你也可以手动创建本地分支并关联远程分支:
git checkout -b feature-your-branch-name origin/feature-your-branch-name
执行完后,本地就会恢复这个feature分支的所有提交了。
3. 极端情况:尝试找回未显式push的提交(成功率低)
如果上述步骤里没找到对应的远程分支,还有一种极小概率的可能:这些提交曾经被push过,但后来分支被删除了,或者提交处于“悬空”状态。你可以试试拉取GitHub的reflog记录(不过GitHub默认不会长期保留这些):
git fetch origin +refs/reflog/*:refs/reflog/*
然后查看本地的reflog:
git reflog
看看有没有相关的提交记录,如果有,可以通过提交哈希值创建分支:
git checkout -b feature-recovered <commit-hash>
但要注意,这个方法的成功率非常低,因为GitHub通常不会存储用户本地的reflog信息,除非有特殊的仓库设置。
后续建议
为了避免再遇到这种情况,建议即使是未完成的feature分支,也定期push到GitHub远程仓库(可以创建私人分支,或者用GitHub的私有仓库),这样相当于给代码做了云端备份,哪怕本地出问题也能轻松恢复。
内容的提问来源于stack exchange,提问作者Zac

