【Git实战技巧】恢复被强制推送push失踪的代码

前言

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,所以被人覆盖后不要等待太久才进行恢复操作,不然可能就真的找不回了。

操作方法

  1. 备份当前工作区的数据

你可以使用git stash等命令备份下现在正在写的代码

  1. 在命令行输入git reflog/git log -g

显示所有历史操作,找到你需要的提交(包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录)

image

2.1 强制回退到当时被删除的commit

git reset --hard <SHA1>

2.2 或者直接

git cherry-pick <SHA1>

直接把当时版本的工作拿回来。不过如果有冲突的话还要处理冲突。

  1. 强推上远程分支
git push -f origin <branch>

如果引起commit丢失的原因并没有记录在reflog 中,比如运行了rm -Rf .git/logs/, 因为 reflog 数据是保存在 .git/logs/ 目录下的,这样就没有 reflog 了。

可以使用 git fsck 工具,该工具会检查仓库的数据完整性。如果指定 --full 选项,该命令显示所有未被其他对象引用 (指向) 的所有对象:

image

然后,用相同的方法就可以恢复它,即创建一个指向该 SHA 的分支。

是不是对于强推git push -f不再慌了呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Git是什么 官方话:Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务...
    梅先森森森森森森阅读 6,091评论 1 3
  • 1. GIT命令 git init在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个re...
    江边一蓑烟阅读 4,253评论 0 0
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 10,395评论 0 9
  • 国家民族个人都面临先天资源禀赋的约束,我们都曾幻想仗剑天涯,四海为家,可到头来,我们都是柴米油盐,蝇营狗苟,命运之...
    浪荡情子阅读 1,423评论 0 1
  • 对这句话是深有感触。 我的母亲是属于刀子嘴豆腐心的女人,在记忆里,她总是因为各种琐碎的小事对我大声训斥,并且从来没...
    饭团团子阅读 1,256评论 0 2

友情链接更多精彩内容