git分支终于找了回来steemCreated with Sketch.

in #cn7 years ago

image source

前几天误删了html5-boilerplate翻译库的一个中文分支,导致所有的翻译全部丢失。经过这几天对git的深入学习,才发现我的这个问题根本算不上问题,只是当时自己对git了解的还不够,所以觉得问题很严重。以下是我解决该问题的过程。

在网上搜索得知使用

git branch recover_branch[新分支] commit_id

这个命令,就可以用这个commit id创建一个分支(即恢复一个分支)。

所以我就想,只要知道被误删分支上的一个commit id,就可以恢复该分支。但我用git log和git reflog显示提交记录,然后用git show查看内容,都找不到被删分支的提交内容。

后来看了Git 内部原理 - 维护及数据恢复Git背后的objectGit 内部原理 - Git 对象这几篇文章,了解了一些底层细节,知道了.git/objects对象库是Git版本库实现的核心。它包含原始数据文件和所有日志消息、作者信息、日期、以及其他用来重建项目任意版本或分支的信息。而Git把块(blob)、目录树(tree)、提交(commit)和标签(tag)这4种类型放在这里面。等一下,这4种类型里面有一个是提交,这不就是我要找的嘛。也就是说,在.git/objects目录下面,包含了所有的提交和其它一些信息。于是git show查看blob文件,果真找到了被误删分支的提交。

后来查到,也可以通过

git fsck --unreachable

命令查找所有unreachable的记录,就不用

find .git/objects

来查看所有文件。

最后通过

git branch cn 查到的commit_id

终于恢复了分支。

最后回头来看,真的是有点羞愧啊。因为不太了解git的一些实现原理,结果对一个简单的问题折腾了这么长时间。如果当初略微懂点的话,不是马上就能解决。不过遇到这个情况也是好事,以此来勉励自己更加努力学好git。

What you want, Go after It.


https://steemit.com 首发。感谢阅读。

欢迎Follow, Upvote, Reply, Resteem (repost)激励我创作更多更好的内容。

@syt

Sort:  

今天也遇到一个commit提交丢失的问题,不过用 git reflog 和 git cherry-pick 解决了。

解决就好,虽然git很强大,但使用还是谨慎一点