http://www.cnblogs.com/kym/archive/2010/08/12/1797937.html

git rebase,顾名思义,就是重新定义(re)起点(base)的作用,即重新定义分支的版本库状态。要搞清楚这个东西,要先看看版本库状态切换的两种情况:

  1. 我们知道,在某个分支上,我们可以通过git reset,实现将当前分支切换到本分支以前的任何一个版本状态,即所谓的“回溯”。即实现了本分支的“后悔药”。也即版本控制系统的初衷。
  2. 还有另一种情况,当我们的项目有多个分支的时候。我们除了在本地开发的时候可能会“回溯”外,也常常会将和自己并行开发的别人的分支修改添加到自 己本地来。这种情况下很常见。作为项目管理员,肯定会不断的合并各个子项目的补丁,并将最新版本推送到公共版本库,而作为开发人员之一,提交自己的补丁之 后,往往需要将自己的工作更新到最新的版本库,也就是说把别的分支的工作包含进来。

举个例子来说吧!假设我们的项目初期只有一个master分支,然后分支上作过两次提交。这个时候系统只有一个master分支,他的分支历史如下:

master0(初始化后的版本)
||
v
master1(第一次提交后的版本)
||
v
master2(第二次提交后的版本)

这个时候,我们可以通过git reset将master分支(工作目录、工作缓存或者是版本库)切换到master1或者master0版本,这就是前面所说的第一种情况。
假设我们这里把master分支通过git reset回溯到了master1状态。那么这个时候系统仍然只有一个master分支,分支的历史如下:

master0(初始化后的版本)
||
v
master1(第一次提交后的版本)

然后,我们在这里以master1为起点,创建了另一个分支test。那么对于test分支来说,他的第一个版本test0就和master1是同一个版本,此时项目的分支历史如下:

master0(初始化后的版本)
||
v
master1(第一次提交后的版本)===test0(test分支,初始化自master分支master1状态)

这个时候,我们分别对master分支、test分支作两次提交,此时版本库应该成了这个样子:

master0(初始化后的版本)
||
v
master1===test0==>test1===>test2
||
v
master2===>master3

  1. 这个时候,通过第一种git reset的方式,可以将master分支的当前状态(master3)回溯到master分支的master0、master1、master2状态。 也可已将test分支当前状态(test2)回溯到test分支的test0、test1状态,以及test分支的父分支master的master0、 master1状态。
  2. 那么。如果我要让test分支从test0到test2之间所有的改变都添加到master分支来,使得master分支包含test分支的所有修改。这个时候就要用到git rebase了。

首先,我们切换到master分支,然后运行下面的命令,即可实现我们的要求:

1
git rebase test

这个时候,git做了些什么呢?

  1. 先将test分支的代码checkout出来,作为工作目录
  2. 然后将master分支从test分支创建起的所有改变的补丁,依次打上。如果打补丁的过程没问题,rebase就搞定了
  3. 如果打补丁的时候出现了问题,就会提示你处理冲突。处理好了,可以运行git rebase –continue继续直到完成
  4. 如果你不想处理,你还是有两个选择,一个是放弃rebase过程(运行git rebase –abort),另一个是直接用test分支的取代当前分支的(git rebase –skip)。

此外,rebase还能够让你修订以前提交,这个功能日后再说。

git rebase/reset小计相关推荐

  1. Git Rebase vs Merge, GIt Reset vs Revert

    Git merge vs Rebase 构造场景如下: https://zhuanlan.zhihu.com/p/29682134?utm_source=wechat_session Git Rest ...

  2. Git 高级用法小抄

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 作者 :  Maxence Poutord 原文: New Frontend 网站 如果你觉得 git 很迷惑人,那么 ...

  3. 你什么时候使用git rebase而不是git merge?

    什么时候建议使用git rebase与git merge ? 成功改造后我还需要合并吗? #1楼 在合并/ rebase之前: A <- B <- C [master] ^\D <- ...

  4. git 代码没了,git rebase 合并提交记录,git stash

    xx 问题 git合并提交记录 创建提交记录 合并提交记录 rebase有冲突 合并后的本地路径提交到远程 其中的参数 pick 改变提交 5.txt 和 4.txt 的顺序 删除某一个提交 rewo ...

  5. 用git rebase合并

    合并issue3分支的时候,使用rebase可以使提交的历史记录显得更简洁. 现在暂时取消刚才的合并. $ git reset --hard HEAD~ 切换到issue3分支后,对master执行r ...

  6. git rebase -i 修改提交

    教程3 改写提交! 6. 用rebase -i 修改提交 为了节省时间,这个教程使用现有的历史记录作为本地数据库. 从这里下载 我们进入stepup-tutorial/tutorial6目录.本地端的 ...

  7. Git Rebase教程: 用Git Rebase让时光倒流

    想象一下你正在开发一个激进的新功能.这将是很灿烂的但它需要一段时间.您这几天也许是几个星期一直在做这个. 你的功能分支已经超前master有6个提交了.你是一个优秀的开发人员并做了有意义的语义提交.但 ...

  8. 这一次彻底搞懂 Git Rebase

    使用 Git 已经好几年了,却始终只是熟悉一些常用的操作.对于 Git Rebase 却很少用到,直到这一次,不得不用. 一.起因 上线构建的过程中扫了一眼代码变更,突然发现, commit 提交竟然 ...

  9. 基于Git rebase修改历史提交信息

    说明 关于为什么要修改历史提交的作者信息和提交信息,我就不多说了,也许是项目规范要求,也许是自己强迫症,总之是有这样的需求. 开始之前先说明一下: 本文介绍的方法只适用于本地仓库,提交到远程以后,我没 ...

最新文章

  1. 【c语言】打印*型金字塔
  2. Zabbix之监控Mysql性能
  3. 沈阳大学计算机考研,计算机专业考研成功经验谈:掌握方法,以不变应万变
  4. matlab 病态方程组,数值分析(Hilbert矩阵)病态线性方程组的求解Matlab程序
  5. mysql 表 区 块 页_数据库 | 001-MySQL梳理系列(一)
  6. Ceilometer的知识总结
  7. 自学JAVA-11:IO流
  8. h264 ES流文件通过计算first_mb_in_slice区分帧边界
  9. html5视频播放器 二 (功能实现及播放优化)
  10. c# socket 服务器端如何判断客户端掉线
  11. 微信js支付换服务器,微信内网页支付(微信 JSAPI 支付)的一点经验
  12. 怎么查ip地址 多种方法教学
  13. oracle 9i for redhat9 下载,RedHat9上安装Oracle9i手记(原作:hotman_x)
  14. 最近在读的一些文章-2019.05
  15. Linux用户间的切换命令su以及su和su - 的区别
  16. 《点石成金》(持续更新)
  17. 图像处理--医疗图片的处理
  18. 计算机少了4个磁盘,电脑硬盘突然少了几个分区,这是怎么回事?如何修复?...
  19. java 6 新特性_Java SE 6 新特性: HTTP 增强(转)
  20. AutoJS4.1.0实战教程 ---火火视频极速版

热门文章

  1. 【数据结构与算法】之深入解析“地图分析”的求解思路与算法示例
  2. iOS之“微信支付”开发流程
  3. Hive 任务卡在 map = 0%, reduce = 0%
  4. Maximum Profit Aizu - ALDS1_1_D
  5. PAT (Basic Level) Practice (中文)1012 数字分类 (20 分)
  6. 《算法竞赛入门经典》 例题5-1 大理石在哪(Where is the Marble,UVa 10474)
  7. 华农计算机科学宿舍在哪个区,新生指南Ⅵ | 住在华农·看看我们第二个家
  8. 唐尼vr眼镜好吗_科普:眼镜片有哪些种类?镜片越薄越好吗?无框眼镜配什么材质?...
  9. Codeforces 987C. Three displays(o(n^2))
  10. C++学习笔记-----存在多态调用时,为基类定义虚析构函数