Git实战技巧:恢复被强制push -f失踪的代码
前言
Git是一个易学难精的分布式版本控制系统,被我们码农常用于代码的管理。如果你还不了解Git,建议先通过廖雪峰的Git教程进行了解,再来看本文,因为本文以使用技巧为主,不会在基础名词上做过多解释。
廖雪峰的Git教程:
https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000
恢复被强制推送push失踪的代码
在常规的开发流程中,难免有时因为各种原因(例如需要使用git rebase)会需要使用到git push -f,也就是强制推送,该命令会覆盖远程分支。
但如果操作不当,会容易把小伙伴的之前提交的commit给覆盖掉,不要慌,这并不代表你小伙伴的commit已经永远找不回来了,大部分情况下,他们还是可以被找回的。
git reflog 可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能查看已经删除了的commit记录
虽然有reflog这跟救命稻草,但由于Git会定时gc(回收),清理掉reflog,所以被人覆盖后不要等待太久才进行恢复操作,不然可能就真的找不回了。
操作方法
- 备份当前工作区的数据
你可以使用
git stash等命令备份下现在正在写的代码
- 在命令行输入
git reflog/git log -g
显示所有历史操作,找到你需要的提交(包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录)
2.1 强制回退到当时被删除的commit
git reset --hard <SHA1>
2.2 或者直接
git cherry-pick <SHA1>
直接把当时版本的工作拿回来。不过如果有冲突的话还要处理冲突。
- 强推上远程分支
git push -f origin <branch>
如果引起commit丢失的原因并没有记录在reflog 中,比如运行了
rm -Rf .git/logs/, 因为 reflog 数据是保存在 .git/logs/ 目录下的,这样就没有 reflog 了。
可以使用
git fsck工具,该工具会检查仓库的数据完整性。如果指定 --full 选项,该命令显示所有未被其他对象引用 (指向) 的所有对象:
然后,用相同的方法就可以恢复它,即创建一个指向该 SHA 的分支。
是不是对于强推
git push -f不再慌了呢?
关注我
我是一名后端开发工程师。
主要关注后端开发,数据安全,爬虫,物联网,边缘计算等方向,欢迎交流。
个人公众号:后端技术漫谈
如果文章对你有帮助,不妨收藏,投币,转发,在看起来~
- git提交之后没有push,代码被覆盖之后恢复
- idea git push提交代码: Push dev to origin/dev was rejected by remote
- Android实战技巧之四十五:复用原有C代码的方案
- Git push 代码报错
- git 远程代码强制覆盖本地代码
- git远程共享库push代码出错
- Git diff代码比较的高级技巧
- 初学git:用git bash往github push代码
- git将本地代码push到gitee上遇见的问题
- Git提交代码push的时候报错:HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large
- 微服务与Docker的整合与测试 Eclipse与GitHub的整合——本地Git仓库中的代码push至GitHub 微服务的手动与自动部署(Jenkins自动部署)
- git push代码报错
- idea git更新,本地代码消失,如何恢复?
- 在使用Git Push代码到数据仓库时
- git 回滚代码后 代码被重置 如何恢复 回滚前的代码
- Git操作:一次性强制push所有分支
- git无法push本地代码至远程仓库解决方法(附git一点芝麻那么大的原理)
- 初学git:用git bash往github push代码
- Android实战技巧之四十:Android5.1.1源代码编译与烧写
- eclipse导入远程git代码及(push、pull、及maven工程导入)