[编程技术] git rebase使用详解
作者:CC下载站 日期:2021-11-20 13:00:51 浏览:24 分类:编程开发
背景
在你看这篇文章之前,我假设你已经至少会git
的一些基本指令,能进行简单的git repo的操作。比如:pull, add, commit, merge, push 等几个基础命令至少会用。而我们刚开始接触git的时候,会这些简单的指令能满足基本的git代码的开发与提交。
但是当你把git作为一个常用的工具之后,还是需要了解一些相对进阶的常用指令。而这篇文章我们来讲讲进阶命令git rebase
。
理解Rebase命令
git rebase 命令的文档描述是:
Reapply commits on top of another base tip
从字面上理解是在另一个基端之上重新应用提交
,这个定义听起来有点抽象,换个角度可以理解为将分支的基础从一个提交改成另一个提交,使其看起来就像是从另一个提交中创建了分支一样
。
下面我来详细讲解一下git rebase
命令最常用的两个用法,让大家更深入的理解 在另一个基端之上重新应用提交 的概念。
Rebase常用的两个使用场景是:
- 合并commit记录
- 合并分支(重写提交历史)
一、合并commit记录
有时候开发一个 feature
的时候,在自己的 feature 分支有过多次修改记录,多的时候有好几十次。每次都进行了一些小的修改。这么多commit看起来很不舒服,而且如果合并到master,导入了过多的commit,导致充满了很多无用的commit记录,如果有一天线上出现问题需要回滚代码,大量的commit记录会让你爆炸。
我这里实际的演示,我在我的开发分支 feature1 开发了一个功能,有多条commit 记录,我想要合并成一条,然后提交MR到master(main)。
Note: github 叫 Pull Request, gitlab 叫 Merge Request,只是叫法不一样。
这个时候就需要用到git rebase
了。这个命令并不难,对于git命令的新手来说不熟悉的情况下可能不太敢使用,你可以在用之前先备份你的分支,避免操作失误又不会还原。
1. 合并最近的三条提交记录
执行:
git rebase -i HEAD~3
或者
git rebase -i commit_id
这里的commit_id是你要合并的第一条commit的前一条。可以通过 git log
查看 commmit id。
这里可以看到我们有三次提交记录:
pick 3ae8e31 fix 1
pick c2828fb fix 2
pick 6077ab1 fix 3
# Rebase c0933b9..6077ab1 onto c0933b9 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
这里有一些Commands
,每个有不同的作用,上面都有详细的解释。
我们暂时只需要关注两个,一个是 p(pick), 一个是 s(squash)。
- p, 保留该commit
- s, 将该commit和前一个commit合并
把第一个commit使用 p,后面的所有commit都使用 s。
2、把除第一条commit外都改成squash
pick 3ae8e31 fix 1
s c2828fb fix 2
s 6077ab1 fix 3
像以上这样,把除了第一条提交之外的所有提交的 pick 改成 s(squash)。 然后使用 :wq 退出编辑。
3、修改commit信息(可选)
如果你觉得第一条的commit不太好,想改成一个比较可读性的commit记录,可以直接修改。
这里我把
fix 1
直接编辑 修改为
feature 1 development
然后 :wq 退出。
4、 git log查看commit记录。
这个时候会发现git log里面关于你的feature只有一条commit记录了,就是rebase成功了。
5、git push -f
最后一步就是执行 git push -f 强制push到远端。一定要加 -f 或者 –force。不然无法push成功。因为你当前的本地分支已经回到了之前的提交点。
这个时候刷新一下你的MR的页面。就会发现:
你的commit已经合并了。这个时候你在Merge到master分支,就只有这一条commit记录了。是不是非常干净了。
注意:
- 如果你的分支里面有来自其他分支的
Merge Request
,比如你的开发周期比较久,在你开发的几次提交中间,不停的git merge master
,导致你的分支里面有了master最新的修改。也就是MR
的记录,慎用rebase
,这个时候我一般会用git reset
。只有当你的分支里面全部是你的commit记录的时候,用git rebase
。
二、合并分支
rebase的第二大作用就是合并分支了。
rebase
通常用于重写提交历史。下面的使用场景在大多数 Git 工作流中是十分常见的:
- 我们从
master
分支拉取了一条feature1
分支在本地进行功能开发 - 远程的
master
分支在之后又合并了一些新的提交 - 我们想在
feature1
分支集成master
的最新更改
下面用具体的例子来描述
1、我们先从 master 分支切出一个 feature1 分支,进行开发:
git:(master) git checkout -b feature1
2、这个时候你的同事可能开发了 feature2 并合并到了 master,此时master 已经领先于你的 feature1 分支了。
3、之后我们需要同步 master 的改动。
最常用的做法就是,在你的feature1
分支执行:
git merge master
使用过git命令的人都了解这个命令。 合并之后查看一下log。执行:
git log
就会发现多了一些 merge 的commit信息。如果你的feature的开发周期很长,经常需要定期merge master,就会发现多了很多的 commit 信息。想要保持一份干净的 commit, 这个时候 git rebase 就派上用场了。
4、使用 git rebase master 代替 git merge master
在你自己的feature1
分支上执行:
git rebase master
这里 git rebase 的原理是什么呢?
- git 会把 feature1 分支里面的每个 commit 取消掉;
- 把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
- 把 feature1 分支更新到最新的 master 分支;
- 把上面保存的 patch 文件应用到 feature1 分支上;
从 commit 记录我们可以看出来,feature1 分支是基于 feature2 合并后的 master,就像把一个并行的流程变成一个串行的流程。就没有了 merge 的 commit 记录,看起来会清晰多了。
Note:
在 rebase 的过程中,也许会出现冲突 conflict。在这种情况,git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容。
git rebase --continue
在任何时候,我们都可以用 –abort 参数来终止 rebase 的行动,并且分支会回到 rebase 开始前的状态。
git rebase —abort
总结:
- 当我们在一个过时的分支上面开发时,执行
git rebase
来同步master
分支的最新改动 - 相比较
merge
来说会减少分支合并的记录
注意:
- 不要在公共分支使用
rebase
,rebase会改变commit历史,其他依赖此分支的人可能会丢失记录。
总结
通过 rebase 策略执行 git pull Git 在最近的某个版本起,直接运行 git pull 会有如下提示消息:
warning: 不建议在没有为偏离分支指定合并策略时执行 pull 操作。 您可以在执行下一次 pull 操作之前执行下面一条命令来抑制本消息:
git config pull.rebase false # 合并(缺省策略)
git config pull.rebase true # 变基
git config pull.ff only # 仅快进
原来 git pull 时也可以通过 rebase 来进行合并,这是因为 git pull 实际上等于 git fetch + git merge ,我们可以修改git配置直接使用 git rebase 替换 git merge来合并 fetch 取得的变更,作用同样是避免额外的 merge 提交以保持线性的提交历史。
具体的使用方式有多种:
- 每次执行 pull 命令时添加特定选项:
git pull --rebase
。 - 为当前仓库设定配置项:
git config pull.rebase true
,在 git config 后添加 –global 选项可以使该配置项对所有仓库生效。
结论
git-rebase 存在的价值是:对一个分支做「变基」操作。
- 当我们某一个分支有过多的 commit 记录需要整合,执行 rebase 来合并提交。
- 当我们在一个过时的分支上面开发的时候,执行 rebase 以此同步 master 分支最新变动;
- 假如我们要启动一个放置了很久的并行工作,现在有时间来继续这件事情,很显然这个分支已经落后了。这时候需要在最新的基准上面开始工作,所以 rebase 是最合适的选择。
<全文完>
猜你还喜欢
- 03-29 [编程相关] Winform窗体圆角以及描边完美解决方案
- 03-29 [前端问题] has been blocked by CORS policy跨域问题解决
- 03-29 [编程相关] GitHub Actions 入门教程
- 03-29 [编程探讨] CSS Grid 网格布局教程
- 10-12 [编程相关] python实现文件夹所有文件编码从GBK转为UTF8
- 10-11 [编程算法] opencv之霍夫变换:圆
- 10-11 [编程算法] OpenCV Camshift算法+目标跟踪源码
- 10-11 [Python] python 创建 Telnet 客户端
- 10-11 [编程相关] Python 基于 Yolov8 + CPU 实现物体检测
- 03-15 [脚本工具] 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏
- 01-08 [编程技术] 秒杀面试官系列 - Redis zset底层是怎么实现的
- 01-05 [编程技术] 《Redis设计与实现》pdf
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[电影] 《环太平洋两部合集》 4K REMUX原盘 [杜比视界] 国英双语音轨 [内封特效字幕] [133.8G]
[电影] 异人之下 The Traveller 2024✨【影版】【4K正式版/HQ超高码/DDP5.1】✚【1080高码】无水印/无压缩
[动漫] 头文字D 动漫 (1998) S01-S06季 1080P 国粤日音轨 续作 剧场版 电影
[小说] 知轩藏书全站7667册txt小说合集精心校对版
[杂志] 电脑爱好者杂志14年 超全 [PDF]
[电影] 西游记全部版本-4K高清修复-总计384G-1986+1996+1998+2002+2010浙版+西游记后传
[纪录片] 【国家地理百年纪念典藏】超经典100集全 MP4格式 (绝佳学习资料)27GB
[纪录片] B站食贫道收费纪录片 *迷失东京* [1080P] 揭露日本大家感兴趣却不为人知的秘密
[网络线报] 城通网盘福利线报解析器 - 获取直连下载地址
[福利线报] 一个「脚本」搞定六大网盘(百度/阿里/天翼/迅雷/夸克/移动)
[游戏] 《黑神话悟空》免安装学习版【全dlc整合完整版】+Steam游戏解锁+游戏修改工具!
[动画] 《名侦探柯南》名侦探柯南百万美元的五菱星 [TC] [MP4]
[电视剧集] [BT下载][黑暗城市- 清扫魔 Dark City: The Cleaner 第一季][全06集][英语无字][MKV][720P/1080P][WEB-RAW]
[涨点姿势] 男性性技宝典:14招实战驭女术——爱抚、按摩、催情、姿势、高潮全攻略
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[短剧] 被下架·禁播的羞羞短剧·午夜短剧合集
[游戏] 黑神话悟空离线完整版+修改器
[图像处理] 光影魔术手v4.6.0.578绿色版
[影视] 美国内战 4K蓝光原盘下载+高清MKV版/内战/帝国浩劫:美国内战(台)/美帝崩裂(港) 2024 Civil War 63.86G
[影视] 一命 3D 蓝光高清MKV版/切腹 / 切腹:武士之死 / Hara-Kiri: Death of a Samurai / Ichimei 2011 一命 13.6G
[影视] 爱情我你他 蓝光原盘下载+高清MKV版/你、我、他她他 2005 Me and You and Everyone We Know 23.2G
[影视] 穿越美国 蓝光原盘下载+高清MKV版/窈窕老爸 / 寻找他妈…的故事 2005 Transamerica 20.8G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[资源] 精整2023年知识星球付费文合集136篇【PDF格式】
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
[美图] 【经典收藏美图集合】1500多张韩国美女高清图片让你的收藏夹更加丰富多彩
- 最新评论
-
有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢WillKwok 评论于:10-09 感谢分享1234123 评论于:10-07 太好了终于找到了谢谢Tom 评论于:10-07 谢谢分享loonghd 评论于:09-30
- 热门tag