目录
7. VSCode GitLens 图为何显示本地 commit
方法 1(推荐):远程 Merge Request(最专业的流程)
(3)代码审核通过后,在 Gitee 的 Web 页面上点击 “Merge”:
摘要:
本篇文章将彻底讲清楚 Git 中最容易混淆的概念:本地分支、本地提交、远程分支 origin/dev、上游分支 tracking、push 与 commit 的区别、VSCode Git 图为什么能看到本地 commit、别人为什么看不到、你在本地创建的分支为什么不会影响公司代码。
阅读完本篇,你对 Git 分支体系将不再困惑。

1. Git 核心
Git 的本质作用只有一句话:
多人协作时,让每个人都有自己的副本,同时保持最终一致性。
因此 Git 必须解决:
-
每个人本地的代码(局部)
-
公司服务器上的代码(远程)
-
本地如何同步远程(push/pull)
-
多人修改同一份代码时如何合并
想要真正灵活使用 Git,必须从 本地 vs 远程 这个关系开始理解。
2. Git 三大空间:工作区 / 暂存区 / 本地仓库
1)工作区(工作目录)
你正在写的文件。
2)暂存区(Stage)
准备提交的内容。
3)本地仓库(Local Repo)
你电脑本地的 commit 历史(别人看不到)。
git push 推送后才进入远程仓库
3. Git 三大分支类型
Git 中实际存在三种分支:
| 类型 | 示例 | 位置 |
|---|---|---|
| 本地分支 | dev、feature/xxx | 你电脑里 |
| 远程分支 | origin/dev、origin/master | 公司服务器(GitLab/Gitee) |
| tracking(上游)分支 | dev → origin/dev | local→remote 的关联 |
4. origin 是什么
许多人会误解:
“origin 是主分支吗?”
“origin/dev 是主仓库吗?”
NO。
origin = 远程仓库的名字
你可以改名:
origin → company, remote, upstream
只不过大家习惯用 origin。
origin 后面的才是分支名:
origin/dev
origin/master
origin/feature/xxx
5. dev vs origin/dev:看懂映射关系
这两个不是同一个分支!
| dev | origin/dev |
|---|---|
| 你电脑的本地分支 | 公司服务器上的 dev 分支 |
| 自己可随意 commit | 公司统一的版本 |
| 不 push 别人看不到 | push 后别人才能看到 |
例子:
本地 dev:
A - B - C(你新 commit)
远程 origin/dev:
A - B
别人看到的是:
A - B
因为 C 没 push。
6. commit 与 push 的本质区别
1)commit:本地行为
更新你电脑里的 Git 历史,别人永远看不到。
2)push:远程行为
将你的 commit 同步到公司 origin,别人才能看到。
commit ≠ push
commit ≠ 提交给公司
commit = 写在自己电脑里
7. VSCode GitLens 图为何显示本地 commit
GitLens 展示的是:
-
你的本地 commit
-
你的本地缓存的 origin/dev
-
你本地检出的其它远程镜像
因此 GitLens 不是团队历史,而是:
你电脑能看到的所有历史
别人电脑不一定和你一样
8. 从远程仓库克隆开始:本地与远程同步机制
克隆:
git clone https://xxx
Git 会为你创建:
-
本地 dev
-
本地 origin/dev(远程镜像)
-
tracking 关系(自动建立)
之后 pull:
git pull
会基于 tracking 做同步。
9. 本地创建分支与远程毫无关系
你本地新建:
git checkout -b mytest
这是一个 纯本地分支:(git checkout)
-
远程没有 origin/mytest
-
别人看不到
-
GitLab/Gitee 不会显示
只有你 push 才会存在:(存在本地与远程的链接)
git push -u origin mytest
10. tracking(上游)分支是什么?为什么重要?
tracking 分支是 Git 中非常关键的概念,它决定你:
-
默认 git pull 从哪里拉?
-
默认 git push 推到哪里?
-
Git status “与上游分支一致 / 落后 / 超前” 的对比对象
-
本地分支与远程分支的映射关系
10.1 什么是 tracking(上游)分支
tracking 分支 = 本地分支与某个远程分支的 配对关系。
例如你查看状态看到:
您的分支与上游分支 'origin/feature/xxx' 一致
说明:
-
本地 feature/xxx
-
默认对应远程 origin/feature/xxx
-
它们的提交历史完全相同
tracking 仅仅是一种“默认目标设置”,它不意味着你的代码会合并到 dev,也不会跨分支传播。
10.2 上游分支的用途(非常重要)
1)git pull 拉取的就是上游分支
例如你在本地 feature/xxx:
git pull
实际上等价于:
git pull origin feature/xxx
不会去拉 origin/dev,也不会拉 origin/master,更不会自动合并到主分支 dev
2)git push 推送的也是上游分支
在本地 feature/lb 时执行:
git push
等价于:
git push origin feature/xxx
也就是说:
push 永远只会推送本地分支对应的远程同名分支(上游分支)
而不是推到主分支 dev。
10.3 如何建立 tracking 关系
方法 1:第一次推送时使用 -u(最常见)
git push -u origin feature/xxx
会自动设置 tracking:
本地 feature/xxx ↔ origin/feature/xxx
方法 2:从远程分支 checkout(自动建立)
git fetch
git checkout feature/lb # 若远程存在 origin/feature/lb
Git 自动建立 tracking。
10.4 关键点
1)推送到“上游分支” ≠ 推到主分支 dev
“git push 推送到上游分支,并没有推到公司的主分支 origin/dev
例如:
-
当前本地分支:feature/xxx
-
上游分支:origin/feature/xxx
执行:
git push
推送到的是:
origin/feature/xxx
不是:
origin/dev 、origin/master
也不会自动合并任何分支。
2)push 永远不会跨分支
push 只做一件事:
把本地分支的内容同步到它自己的 remote tracking branch。
10.5 如何让代码“进入主分支 dev”
push 并不会让代码进入 dev
要合并(merge)才能进入 dev。
你有 3 种标准方式:
方法 1(推荐):远程 Merge Request(最专业的流程)
(1)在本地 feature/xxx 上开发:
git checkout feature/xxx
# 写代码
git add .
git commit -m "xxx"
git push -u origin feature/xxx
(2)在 Gitee上发MR:
-
源分支:
origin/feature/xxx -
目标分支:
origin/dev
(3)代码审核通过后,在 Gitee 的 Web 页面上点击 “Merge”:
远程服务器上执行:
origin/dev ← origin/feature/xxx
(4)本地执行:
git checkout dev
git pull # 同步远程已经合并好的 origin/dev
这种方式的特点是:必须经过代码评审 / 合并权限控制,适合团队协作,有审计记录。
方法 2:本地 merge 再 push
流程:
(1)步骤1:
还是先在 feature/xxx 上本地开发并 commit(注意:commit 还是必须的):
git checkout feature/xxx
# 写代码
git add .
git commit -m "xxx"
#(可选)git push origin feature/xxx
这里你可以选择 push 也可以不 push,
不 push 的话,origin/feature/xxx 根本不存在也没关系。
(2)步骤2:
然后切回 dev,在本地完成合并:
git checkout dev
git pull # 确保本地 dev 是最新的
git merge feature/xxx # 把本地 feature/xxx 合入 dev
(3)步骤3:
合并没问题后,直接推 dev 到远程:
git checkout dev
git pull # 确保本地 dev 是最新的
git merge feature/xxx # 把本地 feature/xxx 合入 dev
这种方式的特点:
确实可以完全绕过 Gitee 上的 MR 审核
但是需要有
origin/dev的推送权限,就能直接把改动推到主分支对小团队 / 个人项目很方便,但大团队一般会禁止直接 push dev/main
方法 3:rebase(整理)+ merge(发布)
适用于一人开发的 feature 分支。
11. 常规开发流程(实际公司开发)
① 拉取最新 dev
git checkout dev
git pull
② 新建功能分支
git checkout -b feature/xxx
③ 本地 commit
git add .
git commit -m "xxx"
④ 推送(第一次需 -u)
git push -u origin feature/xxx
⑤ 远程 Merge Request
合并到 origin/dev。
12. 本地与远程分支示意图
【远程仓库:origin】
┌─────────────────────┐
│ origin/dev │
│ origin/master │
│ origin/feature/xxx │
└─────────────────────┘
▲
│ push/pull
▼
┌────────────────────────┐
│ 本地仓库(你) │
│ │
│ dev │
│ master │
│ feature/xxx │
│ study/test (仅本地) │
└────────────────────────┘
13. Git 常用命令总结(含 VSCode 操作)
| 操作 | 命令行 | VSCode 操作 | 范围 |
|---|---|---|---|
| 初始化本地仓库 | git init | 源代码管理 → 初始化 | 本地 |
| 克隆仓库 | git clone URL | Clone Repository | 本地 ← 远程 |
| 添加暂存 | git add . | + 暂存更改 | 本地 |
| 提交 | git commit -m | ✔ 提交 | 本地 |
| 推送 | git push | 同步更改 | 本地 → 远程 |
| 拉取 | git pull | 同步更改 | 远程 → 本地 |
| 新建分支 | git checkout -b xxx | 底部状态栏 → 创建 | 本地 |
| 推送新分支 | git push -u origin xxx | 同步更改 | 本地 → 远程 |
| 查看日志 | git log / GitLens | Git Graph | 本地 |
| 回退 | git reset —hard | GitHistory | 本地 |
| 删除远程分支 | git push origin --delete xxx | Git Graph | 远程 |
14. 总结
-
本地分支 dev ≠ origin/dev
-
origin 是远程仓库名,不是分支
-
本地 commit 不会影响公司
-
push 才会把代码同步到公司
-
commit = 个人记录;push = 团队记录
-
不 push 别人永远看不到你的 commit
-
上游分支决定 pull/push 默认目标
-
本地创建分支不会自动影响远程
-
VSCode GitLens 显示你“本地看到的历史”
-
正常流程是:本地开发 → commit → push → MR → merge
1962

被折叠的 条评论
为什么被折叠?



