Git学习总结(24)——彻底搞懂 Git-Rebase
使用 Git 已经好几年了,却始终只是熟悉一些常用的操作。对于 Git Rebase 却很少用到,直到这一次,不得不用。
一、起因
上线构建的过程中扫了一眼代码变更,突然发现,commit
提交竟然多达 62
次。我们来看看都提交了什么东西:
这里我们先不说 git
提交规范,就单纯这么多次无用的 commit
就很让人不舒服。可能很多人觉得无所谓,无非是多了一些提交纪录。
然而,并非如此,你可能听过破窗效应,编程也是如此!
二、导致问题
1.不利于代码 review
设想一下,你要做 code review
,结果一个很小的功能,提交了 60
多次,会不会有一些崩溃?
2.会造成分支污染
你的项目充满了无用的 commit
纪录,如果有一天线上出现了紧急问题,你需要回滚代码,却发现海量的 commit
需要一条条来看。
遵循项目规范才能提高团队协作效率,而不是随心所欲。
三、Rebase 场景一:如何合并多次提交纪录?
基于上面所说问题,我们不难想到:每一次功能开发, 对多个 commit 进行合并处理。
这时候就需要用到 git rebase
了。这个命令没有太难,不常用可能源于不熟悉,所以我们来通过示例学习一下。
1.我们来合并最近的 4 次提交纪录,执行:
git rebase -i HEAD~4 |
2.这时候,会自动进入 vi
编辑模式:
s cacc52da add: qrcode s f072ef48 update: indexeddb hack s 4e84901a feat: add indexedDB floder s 8f33126c feat: add test2.js # Rebase 5f2452b2..8f33126c onto 5f2452b2 (4 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # |
有几个命令需要注意一下:
- p, pick = use commit
- r, reword = use commit, but edit the commit message
- e, edit = use commit, but stop for amending
- s, squash = use commit, but meld into previous commit
- f, fixup = like “squash”, but discard this commit’s log message
- x, exec = run command (the rest of the line) using shell
- d, drop = remove commit
按照如上命令来修改你的提交纪录:
s cacc52da add: qrcode s f072ef48 update: indexeddb hack s 4e84901a feat: add indexedDB floder p 8f33126c feat: add test2.js |
3.如果保存的时候,你碰到了这个错误:
error: cannot 'squash' without a previous commit |
注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。
4.如果你异常退出了 vi
窗口,不要紧张:
git rebase --edit-todo |
这时候会一直处在这个编辑的模式里,我们可以回去继续编辑,修改完保存一下:
git rebase --continue |
5.查看结果
git log |
三次提交合并成了一次,减少了无用的提交信息。
四、Rebase 场景二:分支合并
1.我们先从 master
分支切出一个 dev
分支,进行开发:
git:(master) git checkout -b feature1 |
2.这时候,你的同事完成了一次 hotfix
,并合并入了 master
分支,此时 master
已经领先于你的 feature1
分支了:
3.恰巧,我们想要同步 master
分支的改动,首先想到了 merge
,执行:
git:(feature1) git merge master |
图中绿色的点就是我们合并之后的结果,执行:
git:(feature1) git log |
就会在记录里发现一些 merge
的信息,但是我们觉得这样污染了 commit
记录,想要保持一份干净的 commit
,怎么办呢?这时候,git rebase
就派上用场了。
4.让我们来试试 git rebase
,先回退到同事 hotfix
后合并 master
的步骤:
5.使用 rebase
后来看看结果:
git:(feature1) git rebase master |
这里补充一点:rebase
做了什么操作呢?
首先,git
会把 feature1
分支里面的每个 commit
取消掉;
其次,把上面的操作临时保存成 patch
文件,存在 .git/rebase
目录下;
然后,把 feature1
分支更新到最新的 master
分支;
最后,把上面保存的 patch
文件应用到 feature1
分支上;
从 commit
记录我们可以看出来,feature1
分支是基于 hotfix
合并后的 master
,自然而然的成为了最领先的分支,而且没有 merge
的 commit
记录,是不是感觉很舒服了。
6.在 rebase
的过程中,也许会出现冲突 conflict
。在这种情况,git
会停止 rebase
并会让你去解决冲突。在解决完冲突后,用 git add
命令去更新这些内容。
注意,你无需执行 git-commit,只要执行 continue
git rebase --continue |
这样 git
会继续应用余下的 patch
补丁文件。
7.在任何时候,我们都可以用 --abort
参数来终止 rebase
的行动,并且分支会回到 rebase
开始前的状态。
git rebase —abort |
五、更多 Rebase 的使用场景
git-rebase 存在的价值是:对一个分支做「变基」操作。
1.当我们在一个过时的分支上面开发的时候,执行 rebase
以此同步 master
分支最新变动;
2.假如我们要启动一个放置了很久的并行工作,现在有时间来继续这件事情,很显然这个分支已经落后了。这时候需要在最新的基准上面开始工作,所以 rebase
是最合适的选择。
六、为什么会是危险操作?
根据上文来看,git-rebase
很完美,解决了我们的两个问题:
1.合并 commit
记录,保持分支整洁;
2.相比 merge
来说会减少分支合并的记录;
如果你提交了代码到远程,提交前是这样的:
提交后远程分支变成了这样:
而此时你的同事也在 feature1
上开发,他的分支依然还是:
那么当他 pull
远程 master
的时候,就会有丢失提交纪录。这就是为什么我们经常听到有人说 git rebase
是一个危险命令,因为它改变了历史,我们应该谨慎使用。
除非你可以肯定该 feature1
分支只有你自己使用,否则请谨慎操作。
结论:只要你的分支上需要 rebase
的所有 commits
历史还没有被 push
过,就可以安全地使用 git-rebase
来操作。
七、参考:
rebase
git-rebase 使用总结
git 中的 rebase操作
git-rebase vs git-merge 详解
Git学习总结(24)——彻底搞懂 Git-Rebase相关推荐
- 一天彻底搞懂 Git 《Git 原理详解及实用指南》
我是扔物线,Android 开发者,开源贡献者,在 GitHub 上有 4.9k followers 和 7.8k stars ,个人的 Android 开源库 MaterialEditText 被全 ...
- 20分钟教你搞懂Git!
Git 是最流行的版本管理工具,也是程序员必备的技能之一.本文就来教你 20 分钟搞懂 Git! 以下为译文: 尽管每天你都会用到Git,但也有可能搞不懂它的工作原理.为什么Git可以管理版本?基本命 ...
- 20 分钟教你搞懂 Git!
Git 是最流行的版本管理工具,也是程序员必备的技能之一.本文就来教你 20 分钟搞懂 Git! 以下为译文: 尽管每天你都会用到Git,但也有可能搞不懂它的工作原理.为什么Git可以管理版本?基本命 ...
- (转)Git学习教程(一):git简介
原文地址:http://fsjoy.blog.51cto.com/318484/244397 Git学习教程(一):git简介 2009-12-16 13:24:52 标签:git 学习 教程 [推 ...
- Git学习系列之Windows上安装Git之后的一些配置(图文详解)
不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...
- git学习笔记——Linux和Windows下git的基本操作
git学习笔记--Linux和Windows下git的基本操作 github主页:https://github.com/Taot-chen 一.Linux环境 1.安装git sudo apt-get ...
- 学习日志框架之——搞懂logback
文章目录 系列文章目录 一.logback概述 1.Logback简介 2.Logback中的组件 3.Logback配置文件 4.日志输出格式 二.使用示例 1.依赖导入 2.入门案例 3.配置文件 ...
- 好文推荐,15 分钟教你搞懂 Git!
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 译者丨Alex https://www.tutorialdocs.com/article/how- ...
- Git 学习札记(二)安装git以及基本操作
Git 学习札记(二) Linux上的Git基本操作 安装和使用 Git 在linux安装git的命令: sudo apt-get install git 结果如图:(为了截这个图特意卸载了又装了一遍 ...
- 【git学习笔记(一)】Git基础
前言:这段时间,打算学习一下git的操作,了解一下原理,而不是仅仅局限于一些基础的操作,特在此记录一下. 2.1Git基础–获取Git仓库 目的:能够配置并初始化一个仓库(repository).开始 ...
最新文章
- template.process(root, out)的用法(shiro项目中来的九)
- Java中使用UUID给图片命名的文件上传方法
- php fetch mode,odbc_fetch_into
- 查看pytorch和匹配的CUDA版本
- 设计模式之笔记--建造者模式(Builder)
- VS2015sql本地服务器为空,详解VS2015自带LocalDB数据库用法实例
- 关于 ZVT 的后期蜈蚣打发研究
- vue 循环播放音乐列表 音量控制
- 影片推荐:《机械姬》
- 【田姓】宗谱——【郡望堂号】
- 高薪程序员面试题精讲系列74之你熟悉cookie、session吗?有哪些请求方式?请求转发与重定向有什么区别?
- PDPS软件:机器人最佳布局位置自动选择功能介绍与使用方法
- 一份规范的接口文档应该包括什么内容?
- python画羊_Artbreeder 给我画一只电子羊
- 《教务信息管理系统》项目总结
- 激光焊可以代替氩弧焊吗
- 【已解决】Chrome上js不生效
- 常见优化主图错误的几种方式,快来看看店铺主图是否存在这些问题?
- WinPE工具箱功能
- matlab中文乱码解决方案
热门文章
- 混凝土静力受压弹性模量试验计算公式_混凝土试块检测要知道的9个技巧
- 讯飞输入法pad版x86_讯飞搜狗为何抵不过百度输入法?读完你就明白了
- python字符串操作_Python 字符串操作 - 树懒学堂
- android仿bilibili ui,android指纹识别、拼图游戏、仿MIUI长截屏、bilibili最美创意等源码...
- C++之文件操作探究(三):写文件——二进制文件
- win10如何提高电脑画质_win10电脑怎么提高画质 | 手游网游页游攻略大全
- python docx 替换文字_在.docx文件-Python中查找和替换文本
- scrcpy设置快捷键_scrcpy——Android投屏神器(使用教程)
- python rarfile不支持unicode_python – zipfile提取时的unicode错误
- oracle2db2,从Oracle 到DB2(二)