多次执行Git硬重置后如何恢复丢失的提交?
恢复丢失的Git提交
别慌,这种情况其实挺常见的——你丢失的那些提交并没有被彻底删除,只是当前仓库里没有分支或标签引用它们,变成了Git里的孤儿提交而已。结合你提到的旧仓库副本和Bitbucket上能搜到提交哈希的信息,咱们可以一步步把它们找回来:
方法一:从旧本地仓库拉取提交
这是最直接的方式,因为你的笔记本仓库里保留了完整的提交历史:
- 打开当前有问题的仓库,把旧笔记本仓库添加为临时远程源:
(如果是远程共享的旧仓库,也可以填对应的Git URL)git remote add old-local /path/to/your/laptop/repository - 拉取旧仓库的所有提交到本地:
git fetch old-local - 现在你可以用
git log --all --oneline --graph查看所有提交,包括之前丢失的那些,或者直接用哈希验证:git show <your-missing-commit-hash>
方法二:用补丁文件迁移提交
如果不想添加远程源,也可以通过补丁文件把旧仓库的提交迁移过来:
- 在笔记本的旧仓库里,导出需要恢复的提交补丁:
- 要是需要恢复连续的一段提交,用:
git format-patch <start-commit-hash>..<end-commit-hash> - 单个提交的话,用:
git show <missing-commit-hash> > recovery.patch
- 要是需要恢复连续的一段提交,用:
- 把生成的补丁文件复制到当前仓库目录下,然后应用补丁:
- 仅应用代码修改(不保留提交信息):
git apply recovery.patch - 保留原提交的作者、时间和信息:
git am recovery.patch
- 仅应用代码修改(不保留提交信息):
恢复分支到原有状态
找到你需要恢复的提交哈希后,把你的工作分支重置回去:
- 先切换到你的工作分支:
git checkout your-branch-name - 重置分支到目标提交:
git reset --hard <your-missing-commit-hash> - 最后推送到远程Bitbucket(这里需要强制推送,确保当前没有其他同事在这个分支上工作):
git push -f origin your-branch-name
后续预防建议
为了避免再遇到这种麻烦,给你几个小建议:
- 每次做重大合并/重置操作前,先创建一个备份分支:
git checkout your-branch && git checkout -b your-branch-backup-$(date +%Y%m%d) - 合并master时,建议用
git merge --no-commit --no-ff master,这样可以先不自动提交,手动检查所有冲突和代码逻辑后再提交,避免自动合并的隐藏问题 - 学会用
git reflog!它记录了本地仓库所有分支的操作历史(包括重置、合并、切换分支等),下次再遇到提交丢失,直接运行git reflog,找到你操作前的那个哈希,用git reset --hard <hash-from-reflog>就能快速恢复
内容的提问来源于stack exchange,提问作者sparcut
相关产品推荐
相关产品推荐

