有问题为什么不问问神奇的 man 呢?

rebase 也算是我比较常用的一个指令了,但是很长时间以来,对这个指令的认识还是不够深刻,于是就找了个时间认真地读了一下 git rebase 的文档。这份文档不需要在网络上查找,在自己的电脑上直接使用 man git-rebase 就可以查看了。在这份文档中,被提到的几个重要的 rebase 参数就是 newbaseupstreambranch。除此之外,-i 也是一个能够极大的提升使用体验的选项,允许我们交互式的选取需要操作的提交。

git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
[<upstream> [<branch>]]

三个参数

在执行 git rebase 的之前,如果我们指定了 branch 这个参数,那么 git 会在开始 rebase 操作之前签出到 branch

接着,git 会把所有在当前分支但不在 upstream 分支的提交保存到一个临时区域。如果想要在 rebase 开始之前了解哪些提交会被移到临时区域,可以使用 git log <upstream>..<branch> 查看。

然后,如果我们设置了 newbase,那么 git 会把当前分支重置到 newbase ,否则,就重置到 upstream ,这里的效果就相当于 git reset <newbase>

接下来,git 会将之前存放到临时区域内的提交逐个按顺序地重新作用到当前分支上。

根据上面介绍的执行过程,我们可以总结出以下几个知识点:

  1. branch 分支或者执行 git rebase 的当前分支,最终会被移动到 upstream 或者 newbase 分支上

  2. branch 与 upstream 构成了一个选择器,可以通过这两个参数来把 branch..upstream 之间的提交移动跟随 branch 移动到新的地方

这样看来,rebase 做的事其实是使用 upstream 以及 branch 选取一段提交,然后在把这段提交从原先的分支上剪下来,然后嫁接到 upstream 或者 newbase 上去。

接着结合一个简单的例子来熟悉一下 rebase 中这三个参数的作用,例如,我们有这样一个仓库:

  A---B<start>---C---D<feature><HEAD>
/
E---F---G<master>

我们目前位于 feature 分支,现在我们需要使用 rebase 将 feature 分支上的 C、D 两个提交移植到 master 上面。因为最终的目的地是 master 分支,所以可以确定 newbase 参数的值是 master;为了选中 C、D 两个提交,我们可以使用 feature 分支作为 branch 参数,使用 start 分支作为 upstream 参数。最终,我们需要执行的指令就是:

git rebase --onto master start feature

因为,我们目前就在 feature 上面,所以 branch 参数可以省略掉:

git rebase --onto master start

最终我们得到的结果如下所示:

          C'---D'<feature><HEAD>
/
E---F---G
\
A---B<start>

交互式操作后可能会遇到的问题

在交互式 rebase 中,我们可以选取需要操作的提交,但这种可选择的操作有时候可能会给 git 新手造成一种令人慌乱的局面。例如,我们有这样一个仓库:

  A---B---C---D<feature><HEAD>
/
D---E---F<master>

然后,我们执行下面的命令:

git rebase -i master

假设只有 B、C 被选取了,那么这个仓库接下来就会变成:

          B'---C'<feature>
/
D---E---F<master>

现在,你可能已经发现了一个问题,A 与 D 这两个提交“消失”了,这时候先不要慌,可以先想想办法研究出时光机器回到过去阻止自己。当然,这只是一个玩笑。这两个提交并没有真正的消失,他们只是没有被某个分支引用而已。要让它们重新回到分支树上,我们需要先查询这两个提交的 hash :

git reflog feature

reflog 可以帮助我们查看指定分支的操作历史,包括 commit、rebase 等操作。

查询到 hash 之后,只要在这些被历史遗忘的 commit 上创建新的分支,我们就可以在 git log 中重新见到他们了。

学习 Git Rebase的更多相关文章

  1. 使用git Rebase让历史变得清晰

    当多人协作开发一个分支时,历史记录通常如下方左图所示,比较凌乱.如果希望能像右图那样呈线性提交,就需要学习git rebase的用法. “Merge branch”提交的产生 我们的工作流程是:修改代 ...

  2. git 学习(4) ----- git rebase

    使用git rebase 的前提是多人协作下的分支开发,如果是单人开发,那就没有必要使用它了,这是由git rebase 的作用所决定的,git rebase 有两大作用:一个是与主分支保持同步,一个 ...

  3. Gitlab+Jenkins学习之路(五)之git merge和git rebase的区别

    命令行测试 [root@linux-node1 ~]# mkdir testing [root@linux-node1 ~]# [root@linux-node1 ~]# cd testing/ [r ...

  4. git 学习笔记 --- Rebase

    在上一节我们看到了,多人在同一个分支上协作时,很容易出现冲突.即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功. 每次合并再push后,分支变成了这样: $ git l ...

  5. 深入理解学习Git工作流

    http://blog.csdn.net/hongchangfirst/article/list/3 //可以看看 http://blog.csdn.net/hongchangfirst/articl ...

  6. [转]深入理解学习GIT工作流

    深入理解学习Git工作流 字数13437 阅读2761 评论3 喜欢70 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心 ...

  7. 菜鸟学习 git

    到新公司学习和使用 git 有一段时间了.不得不说 git 真的很牛逼,当然,git 的牛逼是建立在 Linux 之父的牛逼的基础上的. 首先跪着推荐 git 学习网站:http://www.liao ...

  8. 深入理解学习Git工作流(转)

    个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎st ...

  9. git rebase和git merge的用法

    http://softlab.sdut.edu.cn/blog/subaochen/2016/01/git-rebase%E5%92%8Cgit-merge%E7%9A%84%E7%94%A8%E6% ...

随机推荐

  1. UI系统的作用

    1.向用户展示信息: 2.将用于与系统的交互解释为指令.

  2. 面向开发人员的Windows错误报告(WER)

    Windows错误报告是更新的Windows XP上Dr.Watson的替代品.它监视故障并收集可以发送到要分析的服务器(如果用户允许)的有用信息.这项功能帮助微软修复了很多错误——由于收到的报告,微 ...

  3. 关于kmp算法

    字符串匹配算法简称kmp 日常安利大佬博客(真的是一篇很好的文章) 觉得百度百科讲的也挺好 就是给出两个字符串a, b 求b在a中的所有位置 next数组:代表当前字符之前的字符串中,有多大长度的相同 ...

  4. PKUSC2019滚粗记

    PKUSC2019滚粗记 Day -INF 在\(\text{APIO}\)时得知省选考崩的自己居然能参加\(\text{SC}\),真是非常意外啊. Day 0 上午机房充斥着放假的气息,居然还成功 ...

  5. JavaScript设计模式经典-面向对象中六大原则

    作者 | Jeskson来源 | 达达前端小酒馆 1 主要学习JavaScript中的六大原则.那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则( ...

  6. IntelliJ IDEA 2019从入门到癫狂 图文教程!

    阅读本文大概需要 6 分钟. 作者:yizhiwazi 来源:www.jianshu.com/p/9c65b7613c30 前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代 ...

  7. 【Beta】Scrum meeting 6

    目录 写在前面 进度情况 任务进度表 Beta-1阶段燃尽图 遇到的困难 照片 commit记录截图 小程序前端仓库 后端代码仓库 技术博客 写在前面 例会时间:5.10 22:30-22:50 例会 ...

  8. 使用MeadCo's ScriptX控件做WEB打印

    官方网址:http://www.meadroid.com/scriptx/index.asp MeadCo's ScriptX控件有两种使用方式,一种是做为免费版本使用,一种是做为收费版本使用,免费版 ...

  9. Salt Highstate数据结构定义

    作者言 这篇文档详细解释了SLS文件中,每个部分的名称与含义,以及SLS中的数据处理后的数据结构. 我只是SaltStack的初学者,如果文中有错误的地方,请不吝赐教.在学习的过程,我做了一些实验,犯 ...

  10. vue-cli安装webpack项目及初始配置

    这个下载包是自己基于 webpack 搞的,可以看看https://github.com/chichengyu/webpack vue-cli安装 输入 npm install vue-cli -g ...