首页/新闻资讯/正文详情

git高阶知识: --rebase,变基的理解以及注意事项

发布时间:2026/11/13 5:12:17 来源:云帆数科 栏目:资讯中心
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 只能用来整理自己还没推上去的本地提交绝不能用来修改远端公共分支上已经存在的历史。”

相关推荐

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

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

C++单例设计模式详细讲解
C++单例设计模式详细讲解

特殊类设计 只能在堆上创建对象的类 请设计一个类,只能在堆上创建对象 实现方式: 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 1 2 … · 2026/11/11 15:14:20

TRAE + Doubao-Seed-Evolving + Android Studio:如何跑通一个旧 App项目
TRAE + Doubao-Seed-Evolving + Android Studio:如何跑通一个旧 App项目

目录 前言 一、拿什么项目来试 Seed Evolving 二、第1轮:先把 22 个构建错误理清楚 三、第二轮:先修核心问题,再处理连锁问题 3.1 Facebook SDK:从 latest.release 改成固定版本 3.2 network_security_config:不… · 2026/10/20 1:34:26

有电工证是什么职称 2026河南最新政策别再交冤枉钱了
有电工证是什么职称 2026河南最新政策别再交冤枉钱了

有电工证是什么职称 2026河南最新政策别再交冤枉钱了 怕考不过白交培训费?你不是一个人。2026年河南最新政策已经出台,电工证考试难度不减反增,很多考生在报名时就踩坑,结果花了几千块培训费,最后还是没拿到证。别急,这篇文章帮你从零开始搞懂… · 2026/11/13 5:12:15

临沧办高压电工证怎么转?上岗必备的转证流程全解析
临沧办高压电工证怎么转?上岗必备的转证流程全解析

临沧办高压电工证怎么转?上岗必备的转证流程全解析 之前考的证在外省能不能转过来?这是很多在外地打工、换城市的高压电工证持证人最关心的问题。如果你刚从外地回来,手头有一张高压电工证,但不知道在临沧是否能直接使用,甚至想在临沧重新考一张,那这篇… · 2026/11/13 5:12:15

工地太忙根本没时间复习考试?潘钦东电工证网上查询攻略来了
工地太忙根本没时间复习考试?潘钦东电工证网上查询攻略来了

工地太忙根本没时间复习考试?潘钦东电工证网上查询攻略来了 工地太忙根本没时间复习考试,特别是像潘钦东电工证这种必须持证上岗的证书,很多一线电工都担心自己没时间准备。其实网上查询早就有了相关资料,但很多人还是摸不清门道。作为在郑州中小施工企业… · 2026/11/13 5:12:15

临沧办高压电工证2026河南最新政策怎么应对学历不高怕报不上名
临沧办高压电工证2026河南最新政策怎么应对学历不高怕报不上名

临沧办高压电工证2026河南最新政策怎么应对学历不高怕报不上名 你是不是也担心学历不够, 临沧办高压电工证 报不了名?别急,2026年河南最新的政策已经明确,学历要求其实并没有你想象得那么高。只要你符合条件,一样可以顺利报考。这篇文章就是帮… · 2026/11/13 5:12:15

潘钦东电工证怎么考|真实经历告诉你怕考不过白交培训费
潘钦东电工证怎么考|真实经历告诉你怕考不过白交培训费

潘钦东电工证怎么考|真实经历告诉你怕考不过白交培训费 怕考不过白交培训费?我有个朋友在洛阳干房建工程的,花了几千块报了个潘钦东电工证培训班,结果考试没过,钱打水漂,人还被单位扣了绩效。这不是个例,我身边至少有5个人有类似遭遇。今天我从实际操… · 2026/11/13 5:12:15

工地太忙根本没时间复习考试,低压证电工证上岗必备怎么搞定
工地太忙根本没时间复习考试,低压证电工证上岗必备怎么搞定

工地太忙根本没时间复习考试,低压证电工证上岗必备怎么搞定 工地太忙根本没时间复习考试,低压证电工证上岗必备怎么搞定?不少电工兄弟都在问这个问题。今天就从 低压证电工证 这个关键词出发,结合 鹤壁水利工程… · 2026/11/13 5:11:15

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/12 14:09:01

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/11 19:07:25

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43

维修电公用考电工证吗 在哪考最靠谱
维修电公用考电工证吗 在哪考最靠谱

维修电公用考电工证吗 在哪考最靠谱 工地太忙根本没时间复习考试,你是维修电工,天天在项目上跑,连抽个空背个题都难。那问题来了—— 维修电公用考电工证吗 ?答案是: 必须考 。尤其是在当前施工行业,没有电工证,连进场都可能被拦下。而且,… · 2026/11/13 0:00:08

电工证是不是可以登高?含金量和证书范围你必须知道的事
电工证是不是可以登高?含金量和证书范围你必须知道的事

电工证是不是可以登高?含金量和证书范围你必须知道的事 证书过期了不知道怎么复审延期,这事儿很多人遇到过,尤其是像你这样在郑州金水区做劳务班组负责人,手里握着几十个工人的证书,稍微一疏忽,就可能影响工程进度和公司信誉。特别是电工证是不是可以登… · 2026/11/13 0:00:08

鸡西电工证哪家下证快官方报名入口怎么找
鸡西电工证哪家下证快官方报名入口怎么找

鸡西电工证哪家下证快官方报名入口怎么找 你是不是也担心 学历不高怕报不上名 ?别急,今天我就来跟你说说, 鸡西电工证哪家下证快 ,还有 官方报名入口 到底怎么找,别让那些“代办”“代考”耽误了你的机会。… · 2026/11/13 0:00:08

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/12 4:35:34

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/12 4:36:01

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/12 21:15:21

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码