当前位置: 首页 > news >正文

git:详解git rebase命令

背景

今天无意中打开 git 官网,发现 git 命令还是很多的,然而我们常用的就那几个,今天来学习一个也不怎么常用的命令 rebase
官网链接
在这里插入图片描述

都说学一个东西最好的方式就是读他的 官方文档,这里我读了一遍,把一些核心的地方整理成这篇 blog

为什么要出现git rebase

首先可以看到,rebase 是属于 Patching 这一类下面的,也就是补丁
在这里插入图片描述

我们平常协同开发基本上都是基于 master 自己拉一个分支,然后发布的时候把各自的分支合并到 master 进行发布,这样做有一些的缺陷:

  1. 当你 merge 了一个比较大的改动,时间线拖得比较长,这时候你 merge 到 master 后,看 master 的提交记录,会有很多别人的提交记录和你的混在一起。

命令

全部命令:

git rebase [-i | --interactive] [<options>] [--exec <cmd>][--onto <newbase> | --keep-base] [<upstream> [<branch>]]git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]--root [<branch>]git rebase (--continue | --skip | --abort | --quit | --edit-todo | --show-current-patch)

常用命令:

发起合并

# 比如要把topic的分支变基到master上,则先切到topic,然后执行
git rebase master
# 或者
git rebase master topic
git pull master --rebase
# 分解为如下,也就是把远程的master作为基地
git fetch master
git rebase master

解决冲突

# 放弃合并,回到rebase操作之前的状态
git rebase --abort
# 则会将引起冲突的commits丢弃掉(慎用!!)
git rebase --skip
# 合并冲突,结合"git add 文件"命令一起用与修复冲突,提示开发者,一步一步地有没有解决冲突。
git rebase --continue

合并提交

# 将多个提交合并为一次提交
git rebase -i HEAD~2

作用一:分支合并

按照这个建立分支

      A---B---C topic/
D---E---F---G master

在这里插入图片描述
在 topic 分支执行 git rebase mater,如果没有冲突,则会变成这样
在这里插入图片描述

在这里插入图片描述

作用二:合并多个提交

必须在你的 commit push 到远端之前使用

git rebase -i HEAD~2

这里的 HEAD~2 代表回退两个commit,具体可以看 这篇文章

reabase原理

  1. git 会把 feature1 分支里面的每个 commit 取消掉;
  2. 把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
  3. 把 feature1 分支更新到最新的 master 分支;
  4. 把上面保存的 patch 文件应用到 feature1 分支上。

冲突处理

执行 rebase 后可能会出现冲突,解决冲突后

git add .
# 注意,这里无需执行 git commit
git rebase --continue

这样 git 会继续应用余下的 patch 补丁文件,所以有可能你会处理多次冲突。
在任何时候,我们都可以用 --abort 参数来终止 rebase 的行动

git rebase --abort

优缺点

优点:

  • 分支干净

缺点:

  • 篡改记录

正因如此,大部分公司其实会禁用rebase,不管是拉代码还是push代码统一都使用merge,虽然会多出无意义的一条提交记录“Merge … to …”,但至少能清楚地知道主线上谁合了的代码以及他们合代码的时间先后顺序

http://www.lryc.cn/news/698.html

相关文章:

  • 第四章——随机变量的数字特征
  • vue2源码阅读理解-响应式数据原理
  • 服务调用分布式session
  • Maven知识点-插件-maven-surefire-plugin简介
  • 如何借力Alluxio推动大数据产品性能提升与成本优化?
  • linux shell脚本被包含是什么意思?.命令和source命令(在脚本中运行脚本,脚本中调用脚本)(脚本包含,父子脚本)
  • MySQL进阶篇之锁(lock)
  • TMDSEVM6657LS评估板恢复出厂默认状态
  • 聊一聊,我对DDD的关键理解
  • 算法笔记(一)—— 认识复杂度和简单排序算法
  • MQ消息中间件常见题及解决办法
  • 网关服务限流熔断降级分布式事务
  • JVM——7JVM调优实战及常量池详解
  • 子串分值【第十一届】【省赛】【A组】
  • SpringCloud 中 Config、Bus、Stream、Sleuth
  • Quantum 构建工具使用新的 TTP 投递 Agent Tesla
  • 浏览器中的 JavaScript 执行机制
  • kafka集群搭建及问题
  • 不要忽视web渗透测试在项目中起到的重要性
  • Early Stopping中基于测试集(而非验证集)上的表现选取模型的讨论
  • appium ios真机自动化环境搭建运行(送源码)
  • 米尔基于ARM嵌入式核心板的电池管理系统(BMS)
  • Java后端项目IDEA配置代码规范检查,使用checkStyle实现
  • Nginx_4
  • linux Ubuntu KUbuntu 系统安装相关
  • 个人信息保护认证
  • Negative Prompt in Stable Diffusion
  • MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量
  • Reflections反射包在springboot jar环境下扫描不到class排查过程
  • 黑马】后台项目171集