使用git rebase 的前提是多人协作下的分支开发,如果是单人开发,那就没有必要使用它了,这是由git rebase 的作用所决定的,git rebase 有两大作用:一个是与主分支保持同步,一个是在合并分支之前清理commit 信息。先看第一个作用。

  当多人协作进行开发的时候,通常都会有一个主分支,如master, 用于合并所有人的代码。而在本地开发的时候,每一个人都会开一个分支,进行分支开发。当我们新开一个分支的时候,就意味着,选择了主分支上的一个点作为开发的起点。如下图所示,

  这时,本地开发的时候,我们每一个commit 都会提交到 new_feature 分支上, 同时,我们的同事也在开发功能, 他们开发完成后,都会把代码同步到master 分支上。我们从远程master 分支进行pull 操作,拉取到本地的master 分支上,随着时间的推移,就会形成如下状态,

  现在怎么办?我们想使用master 分支上的新功能,你可能想到了merge, 但是new_feature 分支还没有开发完成,还没有到merge的时候,那就用git rebase 把。在 new_feature  分支上,使用git rebase master 命令就可以了。

  使用git rebase 后,分支new_feature 以最新的master 作为了起点,这时就可以使用master 上的新功能了。rebase, re + base, 的意思,re 是再一次的意思, base 基的意思,再给它一个基础,就是改变以前的基础,改变分支以前的起点到新的起点上(change the starting point of your local branch)

  但是有的时候,git rebase 会出问题,我们想回到rebase 之前的状态,怎么办?本地分支上的操作,可以使作git reset 进行回退,但是也要找到回退到的commit id. 这时使用git reflog 命令,如果使用的是git rebase, git reflog 打印出的日志就是显示rebase ......, 找到最后一个rebase 后面没有rebase 的id. 

  如上图所示,f883bbd, 就是 我们想要的id, 直接git reset --hard f883bdd 就可以了。

  现在说第二个作用,清理commit 日志。我们再以master 为基础,新建一个分支,就叫new_feature  分支好了,再在该分支上随便提交两次代码,我一次增加了index.js 再一次增加了style.css 文件,

  现在我们想把这个提交日志合并,然后再合并到master 分支上。使用的命令是git rebase --interactive master 然后弹窗一个vim 编辑器,上面就是提交的分支的日起,下面就是一个命令的说明。

  你可以看到,它的日志排列正好和git log 相反, 最后提交的在最下面。合并使用的是squash 命令, 把pick 07ab50c 前面的pick 换成squash, 就是把下面07ab50c 提交日志,合并到fc26711 上。

  然后按esc 键退出 编辑操作,然后再输入:wq , 退出这个弹窗,这时又跳出一个弹窗。

  这个弹窗主要是告诉你git  rebase 做了什么事情,直接  :wq 退出就可以了。

  可以看到rebase 成功,同时git log 也可以看到 两条记录合并到一条记录上了。

  这时,可以愉快地合并到master 分支上了。

  git rebase 冲突解决

  当使用rebase 的时候,有时会发生冲突,这主要是分支开发时间过长,而同事又大量的提交代码。最近我就遇到rebase 冲突的问题。

  当时,我在开发一个功能模块,大约需要两周的时间,而同事呢,都在修复bug, 他们每修复一个bug, 就向远程仓库提交代码,导致我在新建分支开发功能的时候,在master上的起点,大大落后于远程仓库的head. 当开发完这个功能模块的时候,我还是向往常一样,切换到master 分支,从远程仓库拉取代码,然后再git rebase ,但是 rebase 失败,然后就发现我本地有几个文件也被删除掉了,我这里使用的是图形界面化工具进形的rebase, 这时, 我真的有点慌,不知道发生了什么,rebase 失败,怎么会把我本地的文件删除掉呢?胡乱操作了一个晚上,也不知道在操作什么,最终还是没有解决问题,

  第二天,找了git的书籍关于git rebase 的内容又看了一遍,发现 我可以使用git reset --hard 进行回退,我晚上使用的git reset 没有加--hard 参数,所以工作区的内容没有发生变化。回退之后,我还要git rebase, 这时我想使用命令行的方式,进行rebase的操作. git rebase master,把master 分支上的内容合并到 我的开发分支上,同样你会现rebase 失败了。但是和图形化界面操作方式不同的是,它告诉你了冲突的文件,以及解决方式。这时看你的命令行中,你会发现(1/n), 到后来,我才发现这是在合并的时候,有n 个文件发生了冲突。我们现在正在解决第一个冲突,还有就是冲突的文件, 我这里是servcie/api.js, 最后是怎么操作, 有几个使用的命令, git add, git rebase --continue, git rebase --skipe, git rebase --abort。

  我们来解决api.js中的冲突,冲突解决后,要使用git add,  git add server/api.js 把它提交到暂存区,然后,再执行 git rebase --continue, 告诉git 继续rebase. 这时, git 会给出第2个冲突的地方,还是解决冲突,git add , 和git rebase --continue,  git 会依次给出所有冲突的文件,直到你把所有冲突解决掉。有时,在解决冲突的时候,发现搞错了,这时 git rebase --abort, 终止rebase, 回到 rebase 之前的状态,就像回滚。这里一定要注意,使用git add的时候,一定不要使用git commit,   git commit 不是git rebase 解决冲突的步骤,如果使用了,  git 会因为你使用步骤之外的命令来终止rebase 操作。

  现解决完冲突以后,我终于知道,为什么我使用图形化界面工具进行rebase的时候,会删除文件,因为有n个文件有冲突,然后,图形化界面工具一步到位,直接合并失败,没有多余的操作,所以就把有冲突的文件删除了。以后再使用rebase 命令的时候,很小使用图形化界面工具了。

git 学习(4) ----- git rebase的更多相关文章

  1. git学习——<五>git分支

    git学习——<一>git安装 git学习——<二>git配置文件 git学习——<三>git操作 git学习——<四>git版本管理 一.提出问题 今 ...

  2. Git 学习之git 分支(三)

    Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...

  3. Git 学习之 Git Basics

    最近在用git,但git学习曲线实在是有点高. 好在找到一个文档 https://www.atlassian.com/git/tutorial/,以下就是学习笔记吧! git init git ini ...

  4. Git学习记录--git仓库

    Git是一款强大的版本控制工具,与svn相比git的分布式提交,本地仓库等在使用时确实比较方便.当然两者之间各有优劣,我在这里不多做比较.由于之前少有接触git,只是零星大致地了解一点,所以找时间系统 ...

  5. git 学习(1) ----- git 本地仓库操作

    最近在项目中使用git了,在实战中才知道,以前学习的git 知识只是皮毛,需要重新系统的学一下,读了一本叫  Learn Git in a Month of Lunches 的书籍,这本书通俗易懂,使 ...

  6. Git 学习之Git 基础(二)

    Git 基础 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 Git 命令,以后绝大多数时间里用到的也就是这几个命令.读完本章,你就能初始化一个新的代码仓库,做一些适当配置: ...

  7. Git 学习之git 起步(一)

    起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...

  8. git 学习记录—— git 中的仓库、文件状态、修改和提交操作等

    最近开始学习使用版本控制工具  git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...

  9. Git学习之Git 暂存区

    ============================= 修改文件后是否可以直接提交 ============================ (1) 向文件中追加一行内容  $ echo &quo ...

随机推荐

  1. Asp.Net Core微服务再体验

    ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...

  2. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

  3. Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控

    前言 作为一名 Java 开发者,相信对 JDBC(Java Data Base Connectivity)是不会陌生的,JDBC作为 Java 基础内容,它提供了一种基准,据此可以构建更高级的工具和 ...

  4. EF Core 快速上手——EF Core的三种主要关系类型

    系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询   本 ...

  5. 2017-2018年Scrum状态调查报告

    HOW SCRUM IS USED 在2017年的报告中,Scrum的应用范围在扩大,已经从其发源的IT部门扩展到了相距甚远的业务部门.2017-2018年度报告的其中一个主要目标就是关注更广泛的敏捷 ...

  6. WIN10安装不上IIS,使用IISExpress作为发布服务

    [背景] 本人开发Win程序,需要调用网站资源作为Win程序的辅助功能,为此需要本地开发环境支持IIS.最近重装系统,VS安装完后,接着再安装IIS,可以在添加删除程序中反复尝试,均告安装失败提示.最 ...

  7. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  8. select设置text的值选中(兼容ios和Android)基于jquery

    前一段时间改了一个bug,是因为select引起的.当时我没有仔细看,只是把bug改完了就完事了,今天来总结一下. 首先说option中我们通常会设置value的属性的,还有就是text值的,请参见下 ...

  9. arcgis api 3.x for js 实现克里金插值渲染图不依赖 GP 服务(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  10. Odoo / PS Cloud12版本中,产品变体功能如何使用

    场景: 产品:陶瓷马克杯 产品颜色变体:红色.蓝色.白色 产品尺寸变体:10CM.12CM.15CM 每个变体都有不同价格维度 odoo / PS Cloud 专业实施开发 EMAIL:1715860 ...