记初次使用git从误删整个项目到恢复所有文件的经历

前言

  • 新手第一次使用git,对这玩意儿完全没有什么认识,只是想着从学习的角度出发接触一下这个。于是乎恰好手上刚做完一次课程设计作业,想拿此进行练手,顺便上传到github上去。于是我在github上新建了一个仓库,想着用git把我的代码传上去。

悲剧发生

  • 首先由于我对这个东西的认知实在匮乏,在本地瞎操作了一番,不知怎么得不小心从远程仓库中pull了一下,然后,整个文件夹清净了……

情景复现

  • 这是我发现问题后第一时间备份的目录,里面的东西已经是从github上拉下来的了。但是,/.git目录下足足有12MB大小,说明还有恢复的可能性。在命令行中看下状态
nucleus@nucleus-GL552VW:~/桌面/beego_survey$ git status
位于分支 master
您的分支领先 'origin/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)

无文件要提交,干净的工作区
nucleus@nucleus-GL552VW:~/桌面/beego_survey$ git log
commit 4baf4b0e284f43975ec45c24dcb0a541d4a2b734 (HEAD -> master)
Author: xxxxxxxx <xxxxxx@xxxxxx.com>
Date:   Fri Jun 28 22:24:50 2019 +0800

    Revert "Initial commit"
    
    This reverts commit 0ff0709d2cc8d339587afac8f5edbe6c95719f74.

commit 0ff0709d2cc8d339587afac8f5edbe6c95719f74 (origin/master)
Author: xxxxxxxx <xxxxxxx+xxxxxx@users.noreply.github.com>
Date:   Fri Jun 28 21:36:18 2019 +0800

    Initial commit
nucleus@nucleus-GL552VW:~/桌面/beego_survey$ git reflog
4baf4b0 (HEAD -> master) HEAD@{
   
   0}: revert: Revert "Initial commit"
0ff0709 (origin/master) HEAD@{
   
   1}: reset: moving to HEAD
0ff0709 (origin/master) HEAD@{
   
   2}: reset: moving to HEAD
0ff0709 (origin/master) HEAD@{
   
   3}: reset: moving to HEAD
0ff0709 (origin/master) HEAD@{
   
   4}: initial pull
  • 总之,看上去貌似没有办法直接回退到出事之前的状态了。只好上网上搜索看看有没有可能恢复出单个文件之类的。

转机

  • 我搜到了一篇博文,可以找回暂存区丢失的数据。我尝试按博文中的内容恢复出一个文件,
Git 中切换到某个分支后,如果发现代码被误删,可以通过以下方法恢复,具体取决于误删的操作场景: --- ### **1. 如果误删的代码存在于之前的提交中** #### **方法:检出(Checkout)历史版本或文件** - **恢复单个文件**: ```bash git checkout <commit-hash> -- <file-path> # 从指定提交恢复文件 ``` **示例**: ```bash git checkout abc123 -- src/utils.js # 从提交 `abc123` 恢复 `utils.js` ``` - **恢复整个工作目录到某次提交**(慎用,会丢弃所有未提交的修改): ```bash git reset --hard <commit-hash> # 彻底回退到指定提交 ``` --- ### **2. 如果误删的代码存在于其他分支** #### **方法:从其他分支合并或检出文件** - **从其他分支恢复文件**: ```bash git checkout <other-branch> -- <file-path> # 将其他分支的文件覆盖到当前分支 ``` **示例**: ```bash git checkout develop -- src/config.json # 从 `develop` 分支恢复 `config.json` ``` - **合并其他分支的特定提交**: ```bash git cherry-pick <commit-hash> # 将其他分支的某次提交应用到当前分支 ``` --- ### **3. 如果误删的代码未提交(仅在工作区或暂存区)** #### **方法:撤销工作区/暂存区修改** - **撤销工作区的修改**(未 `git add`): ```bash git restore <file-path> # Git 2.23+ 版本 # 或 git checkout -- <file-path> # 旧版本 Git ``` - **撤销暂存区的修改**(已 `git add` 但未提交): ```bash git restore --staged <file-path> # 取消暂存,保留工作区修改 git restore <file-path> # 继续撤销工作区修改(可选) ``` --- ### **4. 如果误删后已经提交** #### **方法:回退提交或重建分支** - **回退到误删前的提交**: ```bash git revert <commit-hash> # 生成一个反向提交,保留历史 # 或 git reset --hard <commit-hash> # 彻底回退(会丢失后续提交) ``` - **通过 `reflog` 找回丢失的提交**(终极恢复手段): ```bash git reflog # 查看所有操作录,找到误删前的提交哈希 git checkout -b recovery-branch <commit-hash> # 基于历史提交创建新分支 ``` --- ### **关键注意事项** 1. **优先使用 `git restore`/`git checkout`**: - 仅恢复文件,避免影响其他修改。 2. **慎用 `git reset --hard`**: - 会彻底丢弃未提交的更改,确保已备份重要代码。 3. **`reflog` 是救命稻草**: - 即使分支被删除或重置,`reflog` 可能保留操作录(默认保存 30 天)。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值