Git:找回rebase丢失的提交

起因

为了避免分支过多导致git提交历史复杂,往往需要使用rebase而非merge来合并自己与他人的代码。
而rebase之后如果发现操作错误,又该如何撤回呢?

git rebase

日常开发往往是这样提交代码:在本地master分支开发,提交几个版本之后,然后使用git fetch命令获取当前远程分支最新版本,再用git rebase命令,将自己的提交与远程分支合并,然后在push到远程。
git中提交的每一个版本都是不会发生变化的,而git rebase却可以将自己的版本移动到远程版本之后,就好像是从最新的远程版本开发的一样,这又是怎么做到的呢?
答案其实很简单,git rebase命令其实是重新创建了新的commit。那么原来的提交为什么消失了呢?因为git已经将原来的分支切到了rebase之后的新提交上,原来的版本没有分支指向它,自然就被隐藏了。很多git可视化工具都只显示有分支的提交。

有没有办法能保留原先的提交呢?
其实很简单,只要保证rebase之后仍然有分支指向原来的提交就可以了。


rebase之前
rebase之后

上面两张图进行了演示,rebase之前,将分支1和分支2都指向e9e0c7d这个提交,然后将分支1rebase到master。

结果可以看到:分支1在master分支之后重新生成了一个提交b49dbef,而分支2仍然指向原来的e9e0c7d。因此,在rebase之前,只要再新建一个分支指向当前提交节点即可。
那么问题来了,如果执行rebase之前没有其他分支指向这个提交,而rebase之后又发现错误想回退,却不记得版本号该怎么办呢?

git reflog

git log不同,git reflog展示的不是提交的历史,而是分支的历史,即一个分支曾经指向过哪些commit。

git reflog 分支1

如上图,git reflog 分支1命令可以看到, 分支1@{0}代表当前分支1指向的提交,而分支1@{1}则代表了分支1上一次指向的版本,同时还带上了rebase的操作记录。(绿色的"分支2"代表当前分支2指向这个节点)

git reflog命令则默认展示HEAD指针的历史:

git reflog

这样,我们就可以从reflog中找到我们的分支原来指向的版本,然后checkout到这个版本就可以了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,803评论 0 10
  • 1. GIT命令 git init在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个re...
    江边一蓑烟阅读 838评论 0 0
  • 以下笔记主要参考gitgot,大致了解git使用和原理。 第一部分我们从个人的视角去研究如何用好Git,并且揭示G...
    carolwhite阅读 2,442评论 0 1
  • 简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 与常用的版本控制工具 ...
    闽越布衣阅读 2,781评论 0 18
  • 本期文艺之星:邛海幽蓝,我心依然,鱼乐儿,简JN,妍筱伊,Ling一00,静若幽莲,双鱼座cy,风言无语,暖意人生...
    我心依然_580a阅读 1,074评论 31 39