git高阶知识: --rebase,变基的理解以及注意事项
变基(–rebase)介绍有时候你使用gitpush origin main:mainGit 拒绝你的推送正是因为远端仓库origin/main包含了你本地没有的新提交可能是你自己在另一台电脑提交的也可能是你的同事推送到远端的。Git 默认有一种保护机制它不允许你直接覆盖远端的历史。如果你强行推送别人的提交就会被“抹除”所以 Git 会报rejected并提示你先fetch拉取再推送。为了解决这个问题你确实需要使用git pull并且强烈推荐使用git pull --rebase变基。下面系统地讲解一下这背后的 Git 原理。一、 核心概念Fetch、Merge 和 Rebase要理解 pull首先要知道git pull的本质。git pullgit fetchgit merge或git rebasegit fetch抓取动作去远端仓库把最新的提交记录下载到本地但绝对不会修改你本地的代码和工作区。它只是更新了本地的“远端跟踪分支”如origin/main。git merge合并动作把下载下来的远端代码和你本地的代码“融合”在一起。如果修改了同一个文件的同一行就会发生冲突Conflict需要你手动解决。git rebase变基动作它的中文叫“变基”改变基底。它的逻辑是先把你本地的提交“暂时拔下来”藏好把远端最新的代码应用到你本地然后再把你“藏起来”的提交一个一个地重新“粘贴”重放到最新代码的后面。二、 原理图解Merge vs Rebase假设你和同事都在main分支上开发。你们共同的祖先是提交B。你本地在B之后提交了C。同事在远端B之后提交了D并推送到远端。此时你的本地和远端分叉了你的本地: A --- B --- C (你的提交) 远端仓库: A --- B --- D (同事的提交)1. 如果使用普通的git pull(默认使用 Merge)Git 会执行 fetch merge。它会创建一个新的“合并提交Merge Commit”E把 C 和 D 结合起来。合并后的本地: A --- B --- C --- E (Merge 提交) \ / --- D缺点提交历史变成了“网状”或“分叉状”。如果团队人多历史线会像蜘蛛网一样复杂充满无意义的Merge branch main of ...提交。2. 如果使用git pull --rebase(使用 Rebase)Git 会执行 fetch rebase。它先把你本地的C暂时拿掉。把远端的D拉到你的本地此时本地是 A-B-D。把你刚才拿掉的C重新“应用”到D的后面变成CC的变基版本。变基后的本地: A --- B --- D --- C优点提交历史变成了一条完美的直线非常干净别人看你的提交记录时就像是你看着同事的代码写完接着往下写的一样没有多余的分叉。三、 解决你当前报错的标准流程既然明白了原理你现在只需要按照以下步骤操作就能把代码推上去了第一步拉取远端代码并变基在终端输入gitpull--rebaseorigin main(注如果你当前就在 main 分支直接git pull --rebase也可以)第二步处理可能的情况执行完上面的命令后会有两种情况情况 A没有冲突顺利终端会提示Successfully rebased and updated refs/heads/main.这就说明变基成功了你的历史已经变成了一条直线。直接进行第三步。情况 B有冲突需要手动解决如果你和同事修改了同一个文件的同一行终端会提示CONFLICT (content): Merge conflict in...。不要慌按以下步骤处理打开代码编辑器如 VSCode找到冲突的文件手动决定保留谁的代码或者把两人的代码融合。解决完冲突后将修改后的文件添加到暂存区gitadd.# 或者 git add 冲突的文件名注意这里不要 commit而是告诉 Git 继续变基gitrebase--continue(如果冲突太复杂你想放弃这次变基可以输入git rebase --abort回到变基前的状态)第三步推送到远端无论是情况 A 还是情况 B 处理完毕现在你的本地代码已经包含了远端的最新内容并且你的提交在最顶端。直接推送即可gitpush origin main(因为你现在是顺着最新的时间线往下推的属于 fast-forward 快进推送Git 就会 happily accept 了)四、 避坑指南Rebase 的“黄金法则”(看不懂的话下面有详细的介绍)虽然rebase能让历史保持干净但它有一个绝对的红线新手一定要记住黄金法则永远不要在已经推送到公共分支且别人已经拉取过的提交上使用 rebase为什么因为 rebase 会改写历史把 C 变成 C’它们的 Hash 值不同了。如果你 rebase 了已经推送到远端的代码然后强行 push你同事本地的代码就会和远端对不上导致他们下次 pull 时出现极其混乱的冲突。正确用法✅本地分支 / 还没 push 的提交放心大胆地用rebase。✅拉取远端最新代码时使用git pull --rebase保持本地历史干净。❌公共的 main/master 分支上已经存在的历史提交绝对不要用git rebase去修改它们。一个小建议如果你希望以后每次git pull都默认使用 rebase可以修改一下 Git 的全局配置省去每次打--rebase的麻烦gitconfig--globalpull.rebasetrue希望这个讲解能帮你彻底理清 Git 的脉络以后遇到rejected你就知道这只是 Git 在温柔地提醒你“嘿有人改了代码你先拉取合并一下再推吧”关于第四、 避坑指南的详细说明:要理解Rebase 的“黄金法则”我们需要深入到 Git 的底层逻辑弄明白“改写历史”到底意味着什么以及它为什么会引发“灾难”。我们可以用一个通俗的比喻和具体的场景来拆解这个问题。一、 核心概念Git 的“指纹”Hash与“蝴蝶效应”在 Git 中每一次提交Commit都不是孤立存在的它包含两部分核心信息你这次修改的代码内容。它父提交的 Hash 值也就是前一个提交的“指纹”。因为当前提交包含了父提交的 Hash所以 Git 的提交链就像一条用指纹锁死的铁链。什么是 Rebase 改写历史当你使用 Rebase 时你改变了某个提交的“父节点”比如把它从 A 移到了 B 下面。因为父节点变了当前提交的 Hash 值就会彻底改变。更可怕的是“蝴蝶效应”当前提交的 Hash 变了它后面所有子提交的 Hash 值也会跟着全部改变结论Rebase 不是简单地“移动”代码而是销毁了旧的提交并创建了一连串全新的提交拥有全新的 Hash 指纹。二、 场景推演如果你违反了法则会发生什么假设你和同事小明都在main分支上协作。1. 初始状态风平浪静远端仓库有 3 个提交。你和同事小明都执行了git pull大家本地的代码和远端完全一致。远端 main: [1] --- [2] --- [3] 小明本地: [1] --- [2] --- [3] 你的本地: [1] --- [2] --- [3](方括号里的数字代表提交的 Hash 指纹)2. 你作死操作改写历史你发现提交[2]的注释写错了于是你在本地使用了git rebase -i修改了[2]。如前所述[2]变成了全新的[2]它后面的[3]也被迫变成了[3]。你的本地: [1] --- [2] --- [3] (指纹全变了)因为你修改了历史普通的git push会被拒绝。于是你使用了强制推送git push -f。远端 main: [1] --- [2] --- [3] (远端被你的新指纹覆盖了)3. 小明的灾难现场对不上号了此时小明本地的代码还是旧的[1] --- [2] --- [3]。他准备下班执行了git pull。此时 Git 的视角是怎样的Git 去远端拉取代码发现远端是[2]和[3]而小明本地是[2]和[3]。因为指纹完全不同Git 根本不认识它们Git 会认为“咦小明本地有[2]和[3]但远端有另外两个完全不相干的提交[2]和[3]。这一定是两个人分别写的两条平行线”于是Git 会尝试把远端的[2]和[3]合并Merge到小明的本地。结果就是代码重复如果[2]和[2]内容其实是一样的合并后小明的代码里会出现两份一模一样的代码疯狂冲突如果内容有微调Git 会把你修改过的[2]和小明本地的[2]放在一起对比瞬间爆发大量冲突。历史极其丑陋小明的提交历史会变成巨大的“X”型交叉原本一条直线变成了乱七八糟的网状。小明看着满屏的冲突和重复的代码一定会崩溃并跑来问你“你到底对 main 分支做了什么”三、 总结如何正确理解这条法则为了避免上述灾难Git 社区总结出了这条黄金法则。你可以用下面这个比喻来记忆本地的、还没 push 的提交你的私人草稿。你可以随意涂改、撕毁、重写随意 Rebase因为别人还没看到不影响任何人。已经 push 到公共分支且别人 pull 过的提交已经印刷出版的书籍。如果你发现书里有个错别字你不能把已经发到读者同事手里的书强行召回销毁Rebase 并 force push。你只能在下一版下一次正常的 Commit中写一个勘误表正常的提交去修复。正确的做法整理自己的草稿如果你本地有 3 个还没 push 的提交觉得太碎了可以用git rebase -i把它们合并成 1 个然后再 push。这是绝对安全且推荐的。同步别人的代码当你要拉取远端最新代码时使用git pull --rebase。这只是把你的“草稿”放到别人“已出版书籍”的后面没有修改别人的历史这也是绝对安全的。一句话口诀“Rebase 只能用来整理自己还没推上去的本地提交绝不能用来修改远端公共分支上已经存在的历史。”

相关新闻

视频字幕提取终极指南:3分钟学会本地OCR字幕生成SRT文件

视频字幕提取终极指南:3分钟学会本地OCR字幕生成SRT文件

视频字幕提取终极指南:3分钟学会本地OCR字幕生成SRT文件 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内…

2026/7/26 6:02:34 阅读更多 →
AM62L DDR防火墙寄存器配置实战:从原理到调试

AM62L DDR防火墙寄存器配置实战:从原理到调试

1. 项目概述:为什么需要深入理解DDR防火墙寄存器在嵌入式系统开发,尤其是涉及汽车电子、工业控制或高可靠性应用时,我们常常会听到“内存保护”、“硬件隔离”这些概念。但真正到了调试阶段,当系统因为一个非法的内存访问而挂起&a…

2026/7/26 6:02:34 阅读更多 →
LeRobot SO-101 机械臂从底层控制到 VLA 视觉语言动作模型完整实操复盘

LeRobot SO-101 机械臂从底层控制到 VLA 视觉语言动作模型完整实操复盘

Task 1本次任务主要完成 LeRobot SO-101 机械臂的环境搭建、串口连接、机械臂校准、关节复位控制以及主从臂遥操作。实验设备为 MacBook Air M5,机械臂由一台 Leader 主动臂和一台 Follower 从动臂组成。除了运行 LeRobot 自带的校准和遥操作程序外,我还…

2026/7/26 6:02:34 阅读更多 →

最新新闻

C++异常处理核心机制与RAII实践:从基础原理到复杂场景应用

C++异常处理核心机制与RAII实践:从基础原理到复杂场景应用

1. 项目概述:为什么C异常处理是资深工程师的“必修课”?干了这么多年C,从桌面应用到服务器后台,再到嵌入式系统,我越来越觉得,异常处理这块内容,是区分“会写代码”和“能写好代码”的一道分水岭…

2026/7/27 7:27:25 阅读更多 →
Godot游戏开发自动化工作流:Aseprite资源导入与Dodo工具实践

Godot游戏开发自动化工作流:Aseprite资源导入与Dodo工具实践

1. 项目概述:当Godot遇上Dodo,一个高效的游戏开发工作流如果你正在用Godot引擎做游戏,尤其是涉及到2D像素风或者需要频繁处理美术资源,那你可能对“资源导入-调整-测试”这个循环感到头疼。美术同学导出的精灵图(Sprit…

2026/7/27 7:27:25 阅读更多 →
基于YOLOv8与改进HRNet的篮球动作实时分析系统

基于YOLOv8与改进HRNet的篮球动作实时分析系统

1. 系统概述与核心价值篮球运动分析正在经历从传统人工观察向智能化技术转型的关键时期。作为一名长期从事体育科技研发的工程师,我在实际项目中发现传统视频分析存在三个致命缺陷:主观判断误差大、关键帧捕捉不精准、量化指标缺失。这套基于YOLOv8与改进…

2026/7/27 7:27:25 阅读更多 →
Unity 2D射击系统全解析:从输入检测到对象池优化

Unity 2D射击系统全解析:从输入检测到对象池优化

1. 项目概述与核心思路最近在做一个2D横版射击游戏,核心玩法就是控制角色移动和发射子弹。这个功能听起来简单,但真要自己动手从零实现,里面门道还挺多的。不是简单实例化一个预制体就完事了,你得考虑子弹从哪里生成、朝哪个方向飞…

2026/7/27 7:27:25 阅读更多 →
AI原生办公助手:重构工作流,提升团队协作效率

AI原生办公助手:重构工作流,提升团队协作效率

你有没有过这样的经历:周一早上打开电脑,面对满屏的邮件、待办事项和会议邀请,感觉整个人都被工作淹没了?上周我就经历了这样的一天——三个项目同时推进,客户需求反复修改,团队协作信息混乱,整…

2026/7/27 7:27:25 阅读更多 →
【非标自动化】2、认识元器件(光电传感器)

【非标自动化】2、认识元器件(光电传感器)

光电传感器光电传感器是一种利用光线检测物体有无、位置、通过状态或距离的传感器。它通常由以下部分组成:发光器接收器信号处理电路输出电路光电传感器先发出可见光或红外光,再根据光线是否被遮挡、反射或返回,判断目标物体是否存在。可以先…

2026/7/27 7:26:24 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻