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

git rebase简介

git rebase核心作用:把你当前分支上的提交,重新“搬到”另一个分支的最新提交后面。

通俗说就是:
你本地写了几个 commit,但主分支master/main/dev已经被别人更新了。你想让自己的代码基于最新主分支继续开发,就可以用rebase


1. 先看普通开发场景

假设公司远程分支是:

origin/dev: A --- B --- C

你从B拉出来开发了两个提交:

你的 feature 分支: A --- B --- D --- E

但是别人已经把C合进了dev

origin/dev: A --- B --- C

现在整体是这样:

D --- E 你的 feature / A --- B --- C origin/dev

你执行:

gitcheckout featuregitfetch origingitrebase origin/dev

rebase 之后变成:

A --- B --- C --- D' --- E'

注意:DE会变成D'E',因为它们被“重新应用”了一遍,commit id 会变。


2.rebasemerge的区别

merge

gitcheckout featuregitmerge origin/dev

结果可能是:

D --- E -------- M / / A --- B --- C ----------

会多一个合并提交M

rebase

gitcheckout featuregitrebase origin/dev

结果是:

A --- B --- C --- D' --- E'

历史更直,看起来像你是基于最新dev开发的。

所以很多公司喜欢:

gitpull--rebase

而不是普通:

gitpull

因为普通pull默认可能会产生 merge commit。


3. 最常用命令

场景一:更新自己的开发分支

你在feature_xxx分支开发,想同步最新dev

gitcheckout feature_xxxgitfetch origingitrebase origin/dev

这就是最常见用法。


场景二:拉代码时直接 rebase

普通拉取:

gitpull

可能会自动 merge。

推荐写法:

gitpull--rebase

等价于:

gitfetchgitrebase origin/当前分支

例如你在dev分支:

gitpull--rebaseorigin dev

4. rebase 遇到冲突怎么办?

执行:

gitrebase origin/dev

如果冲突了,Git 会提示类似:

CONFLICT (content): Merge conflict in main.c

这时候流程是:

第一步:看冲突文件

gitstatus

你会看到哪些文件冲突了。

第二步:打开冲突文件

里面可能是这样:

<<<<<<<HEADintspeed=100;=======intspeed=200;>>>>>>>D

含义:

<<<<<<< HEAD 这是目标分支 origin/dev 上的内容 ======= 这是你自己提交里的内容 >>>>>>> 你的提交

你手动改成最终想要的,比如:

intspeed=200;

然后删除<<<<<<<=======>>>>>>>这些标记。

第三步:标记冲突已解决

gitaddmain.c

第四步:继续 rebase

gitrebase--continue

如果还有冲突,继续重复:

改文件gitadd文件gitrebase--continue

5. 想放弃 rebase 怎么办?

如果 rebase 到一半你懵了,不想继续了:

gitrebase--abort

它会回到 rebase 之前的状态。

这个命令很重要,记住:

gitrebase--abort

6. interactive rebase:整理 commit 用的

这个也很常用,尤其是 Gerrit / Code Review 前。

比如你最近提交了 3 个 commit:

gitlog--oneline

看到:

a3c1111 fix typo b2d2222 add uart driver c1e3333 debug print

你想整理最近 3 个提交:

gitrebase-iHEAD~3

会打开一个编辑界面:

pick c1e3333 debug print pick b2d2222 add uart driver pick a3c1111 fix typo

常用操作:

pick 保留这个 commit reword 修改 commit message squash 合并到上一个 commit,并合并 message fixup 合并到上一个 commit,但丢掉当前 message drop 删除这个 commit

比如你想把fix typo合并到add uart driver

pick c1e3333 debug print pick b2d2222 add uart driver fixup a3c1111 fix typo

保存退出后,Git 会帮你整理提交。


7. 嵌入式项目里最常用的 rebase 流程

假设你在公司开发cat_litter_motor_ctrl分支,主分支是dev

# 1. 切到自己的开发分支gitcheckout cat_litter_motor_ctrl# 2. 拉取远程最新代码gitfetch origin# 3. 把自己的提交搬到最新 dev 后面gitrebase origin/dev# 4. 如果有冲突,解决冲突gitstatus# 手动改冲突文件gitaddxxx.cgitrebase--continue# 5. rebase 完后看提交历史gitlog--oneline--graph--decorate--all

如果你之前已经推送过这个分支,rebase 后 commit id 变了,普通 push 会失败,需要:

gitpush --force-with-lease

不要随便用:

gitpush-f

更推荐:

gitpush --force-with-lease

它比-f安全一些,防止你把别人新推的代码覆盖掉。


8. 最重要的禁忌

不要随便 rebase 公共分支。

比如这些分支不要乱 rebase:

master main dev release

尤其是多人都在用的远程分支。

适合 rebase 的是你自己的开发分支:

feature_xxx bugfix_xxx my_uart_debug

一句话:

自己的分支可以 rebase; 大家共用的分支不要乱 rebase。

9. 你实际最常用记这几个就够了

# 更新远程信息gitfetch origin# 把当前分支变基到最新 devgitrebase origin/dev# 解决冲突后继续gitadd.gitrebase--continue# 放弃 rebasegitrebase--abort# 拉代码时使用 rebasegitpull--rebase# 整理最近 3 个提交gitrebase-iHEAD~3

10. 跟 Gerrit 的关系

你之前用过 Gerrit / repo,这里 rebase 很常见。

比如你提交 review 前,远程tws-dev更新了,你本地 patch 落后了,通常流程是:

gitfetch origingitrebase origin/tws-devgitpush origin HEAD:refs/for/tws-dev

如果 Gerrit 提示冲突,基本就是让你先在本地 rebase 到最新目标分支,再重新推 review。


可以把rebase理解成一句话:

我写的代码不变,但我想假装自己是在最新代码基础上写的。

所以它会把你的 commit 一个一个摘下来,然后重新放到最新分支后面。

http://www.jsqmd.com/news/797750/

相关文章:

  • AI对话魅力工程:从共情到幽默,打造拟人化交互系统
  • 如何免费快速获取网易云音乐歌词?这款开源工具让你告别手动复制
  • AI工具搭建自动化视频生成NVENC
  • [Android] 抖音车机版myDV 1.2.11
  • Airbnb:AI 编写 60% 新代码,客户支持处理 40% 问题,但旅游电商应用仍有难题
  • 【Midjourney Beetroot印相实战指南】:零基础3步复刻暗房胶片质感,2024唯一可商用植物染色AI成像法
  • ENVI 5.3波谱库实战:从自带库浏览到自定义创建,遥感地物识别效率翻倍
  • PyTorch数据集加载进阶:除了CIFAR10,你的自定义数据该怎么准备?
  • 20254111 实验三《Python程序设计》实验报告
  • AI工具搭建自动化视频生成Quick Sync
  • [Android] 星光尺子v1.0
  • VMware解锁macOS完整指南:3步免费运行苹果系统
  • Excel+ChatGPT函数实战:零代码实现语义理解与智能数据处理
  • DFB激光器啁啾参数alpha和kappa到底怎么定?从论文到实际选型的避坑指南
  • 书匠策AI实测手记:我用课程论文功能“偷“回了三个通宵,这波操作值得你抄作业
  • 影刀RPA高阶架构:告别“连点器”式多开,内置原生指纹引擎重塑全域店群防封底座
  • 英雄联盟玩家必备:5分钟快速上手LeagueAkari完整教程
  • 5分钟掌握ExplorerPatcher:Windows界面定制终极指南
  • Perplexity Science杂志搜索效率革命(92%研究者不知道的隐藏参数与语义过滤协议)
  • 别再乱接电阻了!手把手教你为DDR4/DDR5内存信号选对端接方案(附仿真对比)
  • 终极AMD Ryzen调试工具完整指南:免费开源硬件性能调优利器
  • 测试开发全日制学徒班7期第9天“-变量作用域
  • 告别连接失败!用DBeaver连接Oracle数据库时,驱动jar包到底该怎么找怎么配?(附19c实测)
  • 从入门到精通:摄影测量学核心概念与应用全景解析
  • 20254125 实验三《Python程序设计》报告
  • 单电源全范围线性斜坡发生器设计与优化
  • DIY红外热像仪进阶:手把手教你用C语言实现7种伪彩色编码(附完整代码)
  • 免费AI图像修复神器:让模糊照片瞬间变清晰的终极指南
  • Python地理空间数据处理技能库geoskills:简化GIS分析,提升开发效率
  • 逆向工程师的视角:如何用Windbg双机调试分析一个未知Windows驱动(实战案例解析)