git-rebase之食用后悔药

我在进行一个 Git 的常用操作 - rebase 时,遇到了一个致命错误,导致开发分支上的commit丢失。慌张的同时,由于相信 Git 提供了保险措施,我找到了恢复丢失的 commit 的方法。这里记录一下。

我进行的这个 rebase 操作是 Git 分支管理中很常见的一个操作:

我在一个分支上做一个 feature 的开发,这个分支叫做:dev。另外有 master 分支与预发布的分支同步。当有一个功能需要快速开发并上线时,我会切换到 master 分支进行代码编写并合并到预发布分支,然后切换回当前的开发分支:dev。切过去之后需要将 master 的最新修改合并到 dev ,使用 git rebase master 来实现。当 rebase 时遇到冲突,需要将这些冲突的地方手动 fix, 并且 git add 然后 git rebase –continue。但是假如最后一步 没有用 continue, 而是用了 git rebase –skip,那就完蛋了,所有开发分支上未合并到 master 的 commit 统统丢失。

下面开始嗑药:

Git 并不会真的将那些已删除的commits从它的数据中删除,所以我的那些被不小心删除的commits仍旧保存在 Git 的数据文件中,在某个地方,我只需要把它们找出来。

首先,需要查看 .git/logs/refs 目录, 在它下面会看到两个目录 heads 和 remotes。我们需要进入 .git/logs/refs/heads, 因为 remotes 保存的是 remote branch 的信息。在 .git/logs/refs/heads/ 目录下会看到一些和分支同名的文件。找到我操作的分支: dev, 打开查看其中内容。

此文件中保存了我在此分支上的操作记录,也包括了我最近的那次rebase,从操作前head 对应的 commit 的 sha1 到 rebase 之后 head 对应的 commit 的 sha1 。 那接下来的操作就变得十分简单:

$ git checkout -b dev-recovery id

这个操作会以我rebase之前的head为base新建一个 branch,这个branch就包含了我所有丢失的commits。这样丢失的数据就找回来了。

注:后来听同事介绍,下面还有种药,待验证。

git reflog

git reset --hard id

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

相关阅读更多精彩内容

  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,859评论 0 10
  • 1. GIT命令 git init在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个re...
    江边一蓑烟阅读 901评论 0 0
  • 朋友整理的,放这里偶尔过来看看 一、基本介绍 首先,Git作为版本控制系统,他的原理与SVN为首的集中式版本控制系...
    allenzhan阅读 1,109评论 0 3
  • 一、Git是什么? 是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常 大的项目版本管理。 Git ...
    名字谁不会取阅读 1,214评论 0 0
  • 这里没有空气没有声音没有呼吸没有回应 透着一点红色的好多条小鱼挤在小小的逼仄的塑料瓶中
    葺宝阅读 115评论 0 1

友情链接更多精彩内容