目录Git 学习笔记整理链接一、前言二、Git 的三个核心区域工作区 / 暂存区 / 本地仓库2.1 Git 三个区域的介绍及结构示意图1工作区Working Tree2暂存区Index / Staging Area3本地仓库Local Repository2.2 git 命令对比2.3 三大分区的好处1开发例子2命令作用三、远端引用origin/feature/driver 到底是什么3.1 origin 是什么1查看远端2为什么要区分 fetch 和 push3多远端origin upstream4总结3.2 git fetch origin 详细解析1git fetch origin 会把什么拉到本地是所有分支吗2git fetch origin它是不是“拉取远端所有分支的代码到本地”1它会更新“所有远端分支的引用”吗2它会把所有分支都变成本地分支吗3只想更新一个分支行不行4总结3.3 git pull origin xxx —— fetch merge/rebase本地分支会变3.4 git push origin feature/driver —— 改远端仓库3.5 本地分支 vs 远端分支关系图1 用一个真实场景解释2关键结论3那它什么时候会更新3.6 表格总结四、VSCode 左侧“三圆圈 / 源代码管理”到底什么时候变化4.1 你刚改完代码未 add / commit4.2 执行了 git add4.3 执行了 git commit4.4 执行 git push五、总结Git 学习笔记整理链接Git分支实操指南本地学习分支创建远程同步避坑全解析Git 中新建学习分支 暂存修改 VSCode 可视化查看改动超详细教程VSCode Git 全流程可视化操作指南超详细保姆级Git 指令速查含常见工作流 易错点一、前言在真实的团队开发中最常见的不是“不会写代码”而是自己在本地分支上已经改了一堆代码公司远端分支同事也提交了新代码这时你需要既保留自己的修改又同步公司的更新很多人 Git 用了很久却仍然在下面几个问题上反复踩坑工作区、暂存区、本地仓库到底有什么区别origin/feature/driver到底是什么是不是一个分支为什么git commit之后 VSCode 就显示“领先远端”git fetch、git pull、git merge、git rebase到底怎么选本文用一个真实工程分支feature/driver贯穿全文从最底层的 Git 模型开始带你一步步建立清晰、可控、不翻车的 Git 心智模型。二、Git 的三个核心区域工作区 / 暂存区 / 本地仓库理解这三者是理解一切 Git 行为的前提。2.1 Git 三个区域的介绍及结构示意图工作区、暂存区、版本库Git 本地数据管理大概可以分为三个区工作区,暂存区和版本库。工作区Working Directory是直接编辑的地方肉眼可见直接操作。暂存区Stage 或 Index数据暂时存放的区域。版本库commit History存放已经提交的数据push 的时候就是把这个区的数据 push 到远程git仓库了。1工作区Working Tree你正在 VSCode 里编辑的文件假设你当前所在分支是feature/driverAI写代码bash你在 VSCode 中修改了src/driver/driver_node.cppAI写代码bash此时执行gitstatus AI写代码bash会看到modified: src/driver/driver_node.cppAI写代码bash含义代码只存在于你的工作区Git 只是“发现你改了”还没决定是否要保存这次修改2暂存区Index / Staging Area你“决定要提交”的改动集合gitaddsrc/driver/driver_node.cppAI写代码bash再次查看状态gitstatusAI写代码bashChanges to be committed: modified: src/driver/driver_node.cppAI写代码bash含义Git 已经记住「下一次 commit我要把这个文件算进去」但还没有形成提交记录3本地仓库Local Repository一次真正的 Git 提交commitgitcommit-mfeat(driver): 优化控制逻辑AI写代码bash此时发生了三件非常关键的事生成了一个commit有 commit id提交属于本地分支feature/driver公司远端仓库完全不知道这件事总计git commit ≠ 公司已经收到你的代码git commit 只是把修改保存到了“本地仓库”。2.2 git 命令对比gitdiff工作区 vs 暂存区gitdiffhead工作区 vs 版本库gitdiff–cached 暂存区 vs 版本库AI写代码bash起初刚开始什么操作都没有三个区的数据是一致的执行 git diff 命令都为空编辑文件增加代码现在工作区内容发生变化暂存区和版本库内容不变。执行git add 操作后修改同步到暂存区现在工作区和暂存区数据一致。执行git commit 操作后修改已经同步到版本库三区数据再次保持一致。2.3 三大分区的好处1开发例子通过checkout / stash / reset等命令通过不同的参数搭配使用可以在工作区暂存区和版本库之间轻松进行数据的来回切换。1. 修改了多个文件在不放弃任何修改的情况下其中一个文件不想提交如何操作没add操作:gitadd想提交的文件已经add:gitreset –soft 将文件从暂存区回滚到工作区重新add2. 修改到一半的文件突然间不需要或者放弃修改了怎么恢复未修改前文件(git checkout)3. 代码写一半被打断去做其他功能开发未完成代码保存(git stash 提交到缓存区)4. 代码写一半发现忘记切换分支了(git stashgitcheckout)5. 代码需要回滚了—— 含义就是撤销之前的gitcommitgit resetAI写代码bash2命令作用1.gitreset –soft commit_xxid 暂存区-工作区 将commit_xxid提交从暂存区回滚到工作区2.gitreset –mixed commit_xxid 版本库-暂存区将commit_xxid提交从版本库回滚到暂存区3.gitreset –hard commit_xxid 版本库-暂存区-工作区 三个区都清除commit_xxid提交AI写代码bash三、远端引用origin/feature/driver 到底是什么这是 Git 新手和中级开发者最容易混淆的概念。3.1 origin 是什么origin不是“固定关键字”它只是你本地对某个远端仓库起的名字remote 名称。你git clone ...的时候Git 默认把远端仓库命名为origin。所以大家写git fetch origin本质是“从名为 origin 的远端仓库把最新状态同步到本地”1查看远端你可以用下面命令看自己有哪些远端gitremote -vAI写代码bash通常会看到origin gitgitee.com:xxx/robot_driver.git(fetch)origin gitgitee.com:xxx/robot_driver.git(push)AI写代码bash这并不是两个仓库而是字段含义origin远端仓库的名字remote namegit...git远端仓库的地址(fetch)从这个地址拉代码(push)向这个地址推代码2为什么要区分 fetch 和 push因为Git 允许你“拉”和“推”用不同的地址。虽然大多数人这两个地址是一样的但在工程里这是一个非常重要的设计。当然也有可能只有拉或者推一个功能具体看 git remote -v 显示的结果3多远端origin upstream常见于 GitHub / Gitee fork 模型origin gitgithub.com:yourname/project.git(fetch)origin gitgithub.com:yourname/project.git(push)upstream gitgithub.com:company/project.git(fetch)upstream gitgithub.com:company/project.git(push)AI写代码bash含义origin你自己的仓库upstream公司/官方仓库通常从upstreamfetch向originpush4总结fetch和push并不是命令而是远端仓库地址的使用方向。Git 允许为同一个远端仓库配置不同的“拉取地址”和“推送地址”以适应 fork、多仓库、权限隔离等复杂协作场景。因此当我们执行git fetch origin时Git 实际上是使用origin标记的fetch 地址从远端仓库同步最新状态到本地的origin/xxx跟踪分支而当我们执行git push origin feature/driver时Git 使用的是origin对应的push 地址把本地提交推送到远端仓库。origin是远端仓库的名字(fetch)和(push)表示这个远端仓库地址被用于“拉”还是“推”。两者可以相同也可以不同这是 Git 支持复杂团队协作的基础能力。3.2 git fetch origin详细解析1git fetch origin 会把什么拉到本地是所有分支吗默认行为更新“远端跟踪引用”remote-tracking branches执行gitfetch originAI写代码bash他所做的事情远端仓库只读 ↓ 拉取本地的 origin/xxx远端跟踪分支AI写代码bash可以理解为“我本地刷新一下对公司仓库的认知”Git 会做的是去远端origin看哪些分支有新提交然后更新你本地的这些引用origin/devorigin/feature/driverorigin/main……注意它更新的是这些origin/xxx引用快照不是直接改你的本地分支。2git fetch origin它是不是“拉取远端所有分支的代码到本地”严格来说分两层理解1它会更新“所有远端分支的引用”吗通常是会的取决于你 remote 的fetch配置默认是匹配所有分支。你可以看配置gitremote show originAI写代码bash里面会有类似“Remote branches: …”“Local branches configured for ‘git pull’ …”以及 fetch 的映射规则2它会把所有分支都变成本地分支吗不会。git fetch origin只会更新origin/xxx这些“远端跟踪分支”并不会自动创建本地分支xxx。比如远端有feature/Afetch 后你会有origin/feature/A但你本地不一定有feature/A这个可切换开发的分支要创建本地分支一般这样gitswitch-cfeature/A origin/feature/AAI写代码bash3只想更新一个分支行不行当然可以更省流量、更明确gitfetch origin feature/driverAI写代码bash这会更新origin/feature/driver但不会特意更新其它origin/xxx。4总结origin只是远端仓库的默认名字。git fetch只会更新本地的远端跟踪分支如origin/feature/A并不会修改本地分支。git fetch origin的作用是从远端仓库同步最新状态到本地的origin/xxx跟踪引用快照通常会更新远端的多个分支引用但不会直接修改你的本地分支更不会自动生成所有本地分支。本地分支是否与远端分支产生关系取决于你是否显式执行merge或rebase操作。3.3git pull origin xxx—— fetch merge/rebase本地分支会变gitpull origin feature/driverAI写代码bash等价于gitfetch origingit merge origin/feature/driverAI写代码bash 特点❌ 不直接改远端仓库✅ 会改你的本地分支merge / rebase⚠️ 是否产生新提交取决于 merge 还是 rebase可以理解为“先看看公司改了啥再把它合进我当前分支”3.4git push origin feature/driver—— 改远端仓库gitpush origin feature/driver AI写代码bash 特点❌ 不修改你的远端跟踪分支它们是本地的✅ 真正把你的提交发送到远端仓库❌ 不会自动帮别人合代码可以理解为“把我本地的提交推送给公司服务器”3.5 本地分支 vs 远端分支关系图1 用一个真实场景解释现在我们有三种“driver 分支”名称含义feature/driver你正在开发的本地分支origin/feature/driver远端分支在你本地的只读快照远端仓库的feature/driver公司服务器上的真实分支2关键结论origin/feature/driver不是一个你能直接开发的分支它只是「公司远端feature/driver分支在你本地的一份快照引用」3那它什么时候会更新只有当你执行下面命令之一时gitfetch origin AI写代码bash或gitpull AI写代码bashGit 才会做这件事远端仓库 feature/driver ↓更新本地的 origin/feature/driverAI写代码bash如果你没有 fetch / pullorigin/feature/driver可能是几小时前、甚至昨天的状态你看到的并不是公司最新代码3.6 表格总结命令是否改本地是否改远端git fetch✅ 更新 origin/xxx❌git pull✅ 更新当前分支❌git push❌✅四、VSCode 左侧“三圆圈 / 源代码管理”到底什么时候变化这是你问的一个非常关键的问题。结论先给可以直接写博客VSCode 左侧的 Git 状态提示基于的是「本地分支 vs 远端跟踪分支origin/xxx」的差异而不是“是否已经 git push”。4.1 你刚改完代码未 add / commitVSCode 显示文件变更数量表示工作区有改动4.2 执行了git addVSCode 显示“已暂存的更改”“更改”此时仍然没有提交4.3 执行了git commitgitcommit-mxxxAI写代码bash此时 VSCode 会显示⬆️ 向上箭头 数字 含义是本地feature/driver分支比origin/feature/driver领先 N 个提交⚠️ 注意这一步就已经有“分支差异”了即使你还没git pushVSCode 也已经知道你领先远端4.4 执行git pushgitpush origin feature/driverAI写代码bash⬆️ 提示消失本地与远端完全对齐五、总结Git 是分层的而不是一步到位的VSCode 改代码 → 工作区git add → 暂存区git commit → 本地仓库已经领先远端git push → 远端仓库公司才真正看到origin/xxx永远只是远端的“快照”fetch 是认知同步merge/rebase 才是代码合并。总结git基本的工作流程如下在工作目录中修改(此处修改包含了创建和删除)文件暂存文件将文件add放入暂存区域提交更新找到暂存区域的文件将暂存区的文件commit到版本库如果工作区的文件改乱了包括了误删、误改想回到上一版本就可以使用git checkout 命令将版本库中的文件检出到工作区将本次更改discard(覆盖)掉。