`

git中找回丢失的对象

 
阅读更多

本文转载自:http://gitbook.liuhui998.com/5_9.html

译者注: 原书这里只有两个链接: Recovering Lost Commits Blog PostRecovering Corrupted Blobs by Linus
我根据第一个链接,整理了一篇博文,并把它做为原书补充。
一、前言
在玩git的过程中,常有失误的时候,有时把需要的东东给删了。 不过没有关系,git给了我们一层安全网,让们能有机会把失去的东东给找回来。
二、准备
我们先创建一个用以实验的仓库,在里面创建了若干个提交和分支。 BTW:你可以直接把下面的命令复制到shell里执行。

 

mkdir recovery;cd recovery
git init
touch file
git add file
git commit -m "First commit"
echo "Hello World"> file
git add .
git commit -m "Greetings"
git branch cool_branch 
git checkout cool_branch
echo "What up world?"> cool_file
git add .
git commit -m "Now that was cool"
git checkout master
echo "What does that mean?">> file
三、恢复已删除分支提交
现在repo里有两个branch

 

$ git branch
cool_branch
* master
存储当前仓库未提交的改动

 

$ git stash save "temp save"
Saved working directory and index state On master: temp save
HEAD is now at e3c9b6b Greetings
删除一个分支

 

$ git branch -D cool_branch
Deleted branch cool_branch (was 2e43cd5).
$ git branch
 * master
git fsck --lost-found命令找出刚才删除的分支里面的提交对象。

 

 
$git fsck --lost-found
  dangling commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
git show命令查看一个找到的对象的内容,看是否为我们所找的。

 

git show 2e43cd56ee4fb08664cd843cd32836b54fbf594a
 
  commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
  Author: liuhui <liuhui998[#]gmail.com>
  Date:   Sat Oct 23 12:53:50 2010 +0800
 
  Now that was cool
 
  diff --git a/cool_file b/cool_file
  new file mode 100644
  index 0000000..79c2b89
  ---/dev/null
  +++ b/cool_file
  @@-0,0+1@@
  +What up world?
这个提交对象确实是我们在前面删除的分支的内容;下面我们将考虑一下要如何来恢复它了。
使用git rebase命令来恢复

 

  $git rebase 2e43cd56ee4fb08664cd843cd32836b54fbf594a
  First, rewinding head to replay your work on top of it...
  Fast-forwarded master to 2e43cd56ee4fb08664cd843cd32836b54fbf594a.
现在我们用git log命令看一下,看看它有没有恢复:

 

  $ git log
 
  commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
  Author: liuhui <liuhui998[#]gmail.com>
  Date:   Sat Oct 23 12:53:50 2010 +0800
 
  Now that was cool
 
  commit e3c9b6b967e6e8c762b500202b146f514af2cb05
  Author: liuhui <liuhui998[#]gmail.com>
  Date:   Sat Oct 23 12:53:50 2010 +0800
 
  Greetings
 
  commit 5e90516a4a369be01b54323eb8b2660545051764
  Author: liuhui <liuhui998[#]gmail.com>
  Date:   Sat Oct 23 12:53:50 2010 +0800
 
  First commit
提交是找回来,但是分支没有办法找回来:

 

  liuhui@liuhui:~/work/test/git/recovery$ git branch
  * master
我们也可以使用以下命令来把刚才的恢复的提交删除

 

  $ git reset --hard HEAD^
  HEAD is now at e3c9b6b Greetings
再把刚删的提交给找回来:

 

  git fsck --lost-found
  dangling commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
不过这回我们用是合并命令git merge来进行恢复:

 

  $ git merge 2e43cd56ee4fb08664cd843cd32836b54fbf594a
  Updating e3c9b6b..2e43cd5
  Fast-forward
  cool_file |    1+
  1 files changed,1 insertions(+),0 deletions(-)
  create mode 100644 cool_file
六、git stash的恢复
前面我们用git stash把没有提交的内容进行了存储,如果这个存储不小心删了怎么办呢?
假如当前repo里有的存储:

 

$ git stash list
stash@{0}:On master: temp save
把它们清空:

 

$git stash clear
liuhui@liuhui:~/work/test/git/recovery$ git stash list
再用git fsck --lost-found找回来:

 

$git fsck --lost-found
dangling commit 674c0618ca7d0c251902f0953987ff71860cb067
用git show看一下回来的内容对不对:

 

$git show 674c0618ca7d0c251902f0953987ff71860cb067
 
commit 674c0618ca7d0c251902f0953987ff71860cb067
Merge: e3c9b6b 2b2b41e
Author: liuhui <liuhui998[#]gmail.com>
Date:   Sat Oct 23 13:44:49 2010 +0800
 
    On master: temp save
 
diff --cc file
index 557db03,557db03..f2a8bf3
--- a/file
+++ b/file
@@@ -1,1-1,1+1,2@@@
  HelloWorld
  ++What does that mean?
看起来没有问题,好的,那么我就把它恢复了吧:
$ git merge 674c0618ca7d0c251902f0953987ff71860cb067
Merge made by recursive.
 file |    1 +
  1 files changed, 1 insertions(+), 0 deletions(-)
七、其他
其实git中找回丢失的对象,这里最重要的一个命令就是:git fsck --lost-found,因为git中把commit删了后,并不是真正的删除,而是变成了悬空对象(dangling commit)。我们只要把把这悬空对象(dangling commit)找出来,用git rebase也好,用git merge也行就能把它们给恢复。
分享到:
评论

相关推荐

    Git Community Book(中文版)

    高级技能部分则深入到Git的内部机制,如创建空分支、修改历史(amend)、高级分支与合并策略、使用git bisect和git blame进行问题追踪、通过Email使用Git、Git Hooks、找回丢失的对象和管理子模块。 Git生态体系...

    git详细用户手册

    - **找回丢失的更改**:`git reflog`和`git reset --hard`可能帮助找回被删除的提交。 4. **与其他开发者共享开发** - **使用git pull获取更新**:`git pull`结合了`git fetch`和`git merge`。 - **向项目提交...

    GIT学习心得分享.pptx

    - `git reflog`:查看所有Git操作记录,用于找回丢失的提交。 **分支开发模型** Git的分支模型是其强大之处,它允许开发者在不同分支上独立工作,然后合并更改。`git branch`用于创建、列出和切换分支,`git merge...

    拼字游戏:从远程服务器恢复.git文件夹的简单工具

    .git文件夹是Git存储所有版本信息、提交历史和分支的地方,如果这个文件夹丢失,可能会导致项目的历史记录和代码状态无法找回。在这种情况下,Scrabble工具提供了一个可能的解决方案。 Scrabble是一个基于Git Shell...

    25个 Git 进阶技巧(翻译)

    - `git reflog`记录所有Git操作,可以帮助找回丢失的提交。 10. **交互式暂存**: `git add -i`或`git add -p`允许你交互式地选择要暂存的改动。 11. **忽略文件**: `.gitignore`文件用于指定哪些文件或文件...

    中科院高级软件工程期末题库

    - **第一类对象**:JavaScript中的函数是第一类对象,可以像其他对象一样赋值给变量、存储在数据结构中或作为参数传递给其他函数。 - **闭包**:函数可以访问其外部作用域中的变量,即使外部作用域已经关闭也是如此...

    [.Net] C# 一款好看的登录界面源码

    【.Net】C# 是微软开发的一种面向对象的编程语言,广泛应用于构建Windows桌面应用程序、Web应用程序和服务。在本资源中,"一款好看的登录界面源码" 提供了一个设计精美的用户登录界面的示例,这通常是任何软件系统的...

    pb6.PBD反编译工具.rar

    然而,在某些情况下,源代码可能丢失或损坏,这时PBD反编译工具就显得尤为重要,它可以帮助开发者找回部分或全部源代码逻辑。 PB6.PBD反编译工具的工作原理是解析PBD文件中的元数据,然后尝试重构出接近原始的源...

    基于c++的hydrosphere管理系统 (7).zip

    这样的系统可以帮助提高失物找回的效率,减少学生、教职员工因丢失物品而产生的不便。基于C++开发的Hydrosphere管理系统可能是一个专门为此目的设计的软件应用,它利用C++的强大功能和高效性能来处理数据和用户交互...

    恢复SSDT源码

    - **从本地磁盘恢复**:如果源码未被版本控制,但存在于本地磁盘的某个位置,可能需要使用数据恢复软件扫描磁盘以找回丢失的文件。 - **从网络备份恢复**:如果之前有网络备份,如在OneDrive、Dropbox等云存储服务...

    wuziqi.rar_JAVA ME_ME_cae.jar_java 五子棋_wuziqi java

    10. **版本控制**:如果源代码文件已丢失扩展名,可能需要借助版本控制系统(如Git)找回原始的源代码文件。 以上知识点都是从这个项目中可以学习到的基础编程技能和实践经验,对于想要深入Java ME开发或者游戏编程...

    C#推箱子源码 自己做的

    "虽然数据库文件丢失了"意味着游戏中可能使用了数据库存储数据,如用户进度、高分记录等,但由于某些原因,这部分文件已经无法找回。"但有源码的"意味着我们仍然可以获得游戏的主要逻辑和功能代码,这对于学习C#编程...

    物业管理系统

    4. 在开发过程中,保持良好的代码版本控制习惯,例如使用Git,这样即使出现类似表结构丢失的问题,也可以通过历史版本找回相关代码。 综上,【物业管理系统】的开发涉及了SSH2框架的综合运用,以及数据库表结构的...

    基于微信小程序开发的校园失物招领(微信小程序)系统源码毕业设计.zip

    【标题】与【描述】提及的是一个基于微信小程序开发的校园失物招领系统源码,这是一款专门针对学生和教职员工设计的应用,旨在帮助找回遗失物品并促进校园内的互助精神。这个毕业设计项目提供了完整的源代码,使得...

    My-Practice:但是你再也找不到数据

    在这个项目中,可能包含了一系列练习,用于演示如何在JavaScript中有效地处理和检索数据,以及如何在数据丢失或难以找回的情况下进行应对。 JavaScript是Web开发中的基础,它允许开发者在用户浏览器上执行代码,...

    MAD-Project:这是我们项目的新存储库。 由于某些错误,我删除了前一个。 我们将从这个存储库中的所有元素开始

    如果旧存储库没有完全丢失或者有备份,通常可以通过恢复操作来找回。但既然决定从新存储库开始,那么可能意味着之前的代码或状态无法恢复,需要重新编写或重构。 4. **Java编程**:标签中提到“Java”,这意味着MAD...

    基于Vue+Springboot高校失物招领系统设计毕业源码案例设计.zip

    这个系统旨在为大学校园内的师生提供一个便捷、高效的失物招领平台,帮助找回丢失物品,增进校园社区的互助精神。以下是该项目涉及的主要知识点和技术栈的详细说明: 1. **Vue.js**:Vue.js是一个轻量级的前端...

    基于springboot的宠物领养系统源码数据库.doc

    3. **宠物认领管理**:处理遗失宠物的找回请求,提供宠物认领服务。 4. **教学视频管理**:上传与宠物护理相关的教学视频供用户学习。 5. **感谢信管理**:记录领养者对救助组织的感谢之情。 6. **公告管理**:发布...

    Restore

    4. **云存储恢复**:如果图床位于云端,如GitHub、阿里云对象存储等,恢复可能涉及恢复版本历史或从备份副本中恢复。 5. **错误修复**:有时文件系统可能会出错,导致数据不可访问。这时需要使用chkdsk等工具检查并...

Global site tag (gtag.js) - Google Analytics