git 学习(4) ----- git rebase
使用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的更多相关文章
- git学习——<五>git分支
git学习——<一>git安装 git学习——<二>git配置文件 git学习——<三>git操作 git学习——<四>git版本管理 一.提出问题 今 ...
- Git 学习之git 分支(三)
Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...
- Git 学习之 Git Basics
最近在用git,但git学习曲线实在是有点高. 好在找到一个文档 https://www.atlassian.com/git/tutorial/,以下就是学习笔记吧! git init git ini ...
- Git学习记录--git仓库
Git是一款强大的版本控制工具,与svn相比git的分布式提交,本地仓库等在使用时确实比较方便.当然两者之间各有优劣,我在这里不多做比较.由于之前少有接触git,只是零星大致地了解一点,所以找时间系统 ...
- git 学习(1) ----- git 本地仓库操作
最近在项目中使用git了,在实战中才知道,以前学习的git 知识只是皮毛,需要重新系统的学一下,读了一本叫 Learn Git in a Month of Lunches 的书籍,这本书通俗易懂,使 ...
- Git 学习之Git 基础(二)
Git 基础 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 Git 命令,以后绝大多数时间里用到的也就是这几个命令.读完本章,你就能初始化一个新的代码仓库,做一些适当配置: ...
- Git 学习之git 起步(一)
起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...
- git 学习记录—— git 中的仓库、文件状态、修改和提交操作等
最近开始学习使用版本控制工具 git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...
- Git学习之Git 暂存区
============================= 修改文件后是否可以直接提交 ============================ (1) 向文件中追加一行内容 $ echo &quo ...
随机推荐
- SmartCode 使用常见问题
SmartCode 常见问题 SmartCode 能干什么? SmartCode = IDataSource -> IBuildTask -> IOutput => Build Ev ...
- NTP服务和DNS服务(week3_day3)--技术流ken
NTP时间服务器 作用:ntp主要是用于对计算机的时间同步管理操作. 时间是对服务器来说是很重要的,一般很多网站都需要读取服务器时间来记录相关信息,如果时间不准,则可能造成很大的影响. 部署安装NTP ...
- RESTful 规范
RESTful 规范 前言 rest 是一种软件架构风格,如果使用的是 rest 接口,那么就可以说你的接口是 restful. rest接口是围绕''资源''展开的,利用 HTTP 的协议,其实 r ...
- windows环境设置mysql自动备份(测试成功)
00.背景介绍 最近做了个小程序,使用的是mysql数据库,涉及到将程序数据备份的事:虽然大部分数据库客户端工具都具有备份功能,但并不能做到定期自动备份:在Windows环境下,手工备份MySQL是很 ...
- Redis 过期键删除策略
Redis 中数据库键的过期时间都保存在过期字典中,当一个键过期了,Redis 存在三种不同的删除策略:定时删除.惰性删除和定期删除 定时删除 定义 在设置键的过期时间的同时创建一个计时器,让定时器在 ...
- vue-router 页面布局
在单页面应用程序(SPA)中,有些页面的布局结构是上下两块是固定,中间内容是变化的.这时在入口处固定上下部分就可以很好的解决这一问题.有少部分页面没有上下部分或不需要(如:用户注册.登陆页面),针对这 ...
- web开发布局---传统布局篇
1.传统布局 盒状模型结合 display 属性.float 浮动以及 position 定位属性设计的各式传统布局形式. 2.说再多不如动手实践,下面举三个例子 html 部分代码: <sec ...
- 第四次上机,ASP组件的使用
<html> <body> <% '以下连接数据库,建立一个Connection对象实例conn Set conn=Server.CreateObject("A ...
- VR一体机如何退出FFBM(QFIL)
前文介绍了通过fastboot命令擦除misc分区,从而退出FFBM的方法.这个方法比较简便,但有不灵的时候,fastboot erase misc命令执行失败,如下图所示. erasing 'mis ...
- webstorm2018.1 汉化
https://github.com/pingfangx/TranslatorX 这个百度云 选择webstorm 选择勾选的文件 选择你下载webstorm 的版本 我下载的是2018.1的 之后等 ...