文章目录
- [一、git pull = git fetch + git merge](#一、git pull = git fetch + git merge)
-
-
- [1. git fetch(只下载,不合并)](#1. git fetch(只下载,不合并))
- [2. git merge(合并)](#2. git merge(合并))
- [3. git pull = 上面两步自动一起做](#3. git pull = 上面两步自动一起做)
- 最直观的区别
-
- 二、提交和提交并推送
-
-
- [1. 提交(Commit)= 只保存在你自己电脑上](#1. 提交(Commit)= 只保存在你自己电脑上)
- [2. 提交并推送(Commit & Push)= 本地保存 + 同步到远程](#2. 提交并推送(Commit & Push)= 本地保存 + 同步到远程)
- [3. 一句话总结](#3. 一句话总结)
- [4. 你看到的"Commit and Push"按钮](#4. 你看到的“Commit and Push”按钮)
-
- 三、仓库私有化
-
- [1、Private 到底有多"隐私"](#1、Private 到底有多“隐私”)
- [2、什么时候推荐用 Private(你的情况正好符合)](#2、什么时候推荐用 Private(你的情况正好符合))
- [3、上传到 Private 仓库的简单步骤(给你现成命令)](#3、上传到 Private 仓库的简单步骤(给你现成命令))
- [四 `.gitignore`](#四
.gitignore) -
- [1. `.gitignore` 到底是干嘛的?](#1.
.gitignore到底是干嘛的?) - [2. 为什么绝对不能把密码/密钥传到 GitHub?](#2. 为什么绝对不能把密码/密钥传到 GitHub?)
- [3. 怎么防止密码/配置文件被提交?](#3. 怎么防止密码/配置文件被提交?)
- [4. 最关键的知识点(新手必懂)](#4. 最关键的知识点(新手必懂))
-
- [✅ `.gitignore` 只对 **从未被提交过的文件** 生效](#✅
.gitignore只对 从未被提交过的文件 生效)
- [✅ `.gitignore` 只对 **从未被提交过的文件** 生效](#✅
- [5. 你现在的项目怎么做最安全?(直接照做)](#5. 你现在的项目怎么做最安全?(直接照做))
- [1. `.gitignore` 到底是干嘛的?](#1.
- 五、main和分支
-
- [1.除了 main,你可以建无数个分支](#1.除了 main,你可以建无数个分支)
- [2. 新建分支时,自带 main 的全部代码](#2. 新建分支时,自带 main 的全部代码)
-
- [**新建分支 = 复制一份当前 main 的代码**](#新建分支 = 复制一份当前 main 的代码)
- [3. 之后你在 dev 上改代码,不会影响 main](#3. 之后你在 dev 上改代码,不会影响 main)
-
- [**分支 = 代码的平行世界**](#分支 = 代码的平行世界)
- [4. 最常用的分支操作(你马上就能用)](#4. 最常用的分支操作(你马上就能用))
- [六、 dev 分支合并回 main](#六、 dev 分支合并回 main)
-
- 1、合并的本质
- 2、最标准、最安全的合并流程(直接照敲)
-
- [1)先切回 main](#1)先切回 main)
- [2)保证 main 是最新的(避免冲突)](#2)保证 main 是最新的(避免冲突))
- [3)把 dev 合并到 main](#3)把 dev 合并到 main)
- [4)推送到 GitHub(让云端也更新)](#4)推送到 GitHub(让云端也更新))
- 3、如果出现冲突(CONFLICT)怎么办?
- [4、分支最常用 4 条命令(你必须记住)](#4、分支最常用 4 条命令(你必须记住))
- [七、Git 和 SVN 的核心区别](#七、Git 和 SVN 的核心区别)
-
- [1. 最本质区别(必懂)](#1. 最本质区别(必懂))
- [2. 断网能不能工作?(最大区别)](#2. 断网能不能工作?(最大区别))
- [3. 分支功能对比](#3. 分支功能对比)
- [4. 安全性](#4. 安全性)
- [5. 现在企业用哪个?](#5. 现在企业用哪个?)
- [6. 超级大白话对比(最好记)](#6. 超级大白话对比(最好记))
-
- [**SVN 就像:只有一个U盘,大家轮流用**](#SVN 就像:只有一个U盘,大家轮流用)
- [**Git 就像:每人都有完整U盘副本**](#Git 就像:每人都有完整U盘副本)
- [**Git 是分布式,本地有全部历史,断网能用,分支强大。**](#Git 是分布式,本地有全部历史,断网能用,分支强大。)
- [**SVN 是集中式,必须联网,依赖中央服务器,分支弱。**](#SVN 是集中式,必须联网,依赖中央服务器,分支弱。)
- [**现在所有新项目、所有大厂,全部用 Git!**](#现在所有新项目、所有大厂,全部用 Git!)
- [八、 Branches & Tags](#八、 Branches & Tags)
-
-
- [1. 图里的信息](#1. 图里的信息)
- [2. 分支 vs 标签,核心区别](#2. 分支 vs 标签,核心区别)
- [3. 最常用的标签命令(你现在就能试)](#3. 最常用的标签命令(你现在就能试))
- [4. 标签的两种类型(简单了解)](#4. 标签的两种类型(简单了解))
-
- [九、Release & Tag](#九、Release & Tag)
- [十、worktree VS branch](#十、worktree VS branch)
-
- [**分支 = 只能同时开一个窗口干活**](#分支 = 只能同时开一个窗口干活)
- [**worktree = 可以同时开多个窗口干活**](#worktree = 可以同时开多个窗口干活)
- [1、用场景告诉你:没有 worktree 会有多痛苦](#1、用场景告诉你:没有 worktree 会有多痛苦)
-
-
- [场景 1:突然要紧急改 BUG](#场景 1:突然要紧急改 BUG)
- [场景 2:你想同时对比两个版本的代码](#场景 2:你想同时对比两个版本的代码)
- [2、终极答案:worktree 到底解决什么?](#2、终极答案:worktree 到底解决什么?)
-
- 分支的限制:
- [worktree 的能力:](#worktree 的能力:)
- [**分支 = 一台电视,换台就要切画面**](#分支 = 一台电视,换台就要切画面)
- [**worktree = 多台电视,同时看不同频道**](#worktree = 多台电视,同时看不同频道)
-
- [3、你在 Codex 里为什么会看到 worktree?](#3、你在 Codex 里为什么会看到 worktree?)
-
- **分支是为了版本隔离**
- [**worktree 是为了【同时打开多个分支】而存在的**](#worktree 是为了【同时打开多个分支】而存在的)
一、git pull = git fetch + git merge
一步到位:拉取最新代码 + 自动合并到本地
1. git fetch(只下载,不合并)
- 去 GitHub 把最新代码/版本信息下载到本地
- 不会修改你当前写的代码
- 只是"看看更新了啥"
2. git merge(合并)
- 把下载下来的最新代码,合并到你当前的分支
- 让你的本地变成最新版
3. git pull = 上面两步自动一起做
git pull = git fetch + git merge
最直观的区别
| 命令 | 作用 | 是否改本地代码 | 安全度 |
|---|---|---|---|
| git fetch | 只下载最新信息 | ❌ 不改 | 最安全 |
| git merge | 合并下载的代码 | ✅ 改 | 中等 |
| git pull | 下载 + 自动合并 | ✅ 改 | 日常用 |
- pull = 自动拉取 + 合并
- fetch = 只拉取,不合并
- push = 上传到 GitHub(唯一能改云端的)
二、提交和提交并推送
1. 提交(Commit)= 只保存在你自己电脑上
完整三步是:
bash
git add . # 把改动"打包到暂存区"
git commit -m "xxx" # 把暂存区的改动,保存到**本地仓库**
- 只在本地生成一条版本记录
- GitHub 上看不到,别人也拉不到
- 相当于:写在自己笔记本上,没发给别人
2. 提交并推送(Commit & Push)= 本地保存 + 同步到远程
就是:
bash
git add .
git commit -m "xxx"
git push origin main # 把本地所有新提交,上传到 GitHub
- 既在本地 记录版本,也同步到远程仓库
- GitHub 立刻能看到,别人能拉到你的代码
- 相当于:写完笔记 → 拍照发给团队
3. 一句话总结
- git commit :只在本地存快照,不上传
- commit + push :本地存快照 并且 上传到远程(GitHub)
4. 你看到的"Commit and Push"按钮
IDE(VSCode 等)里那个按钮,本质就是帮你一次性执行:
add → commit → push
三、仓库私有化
设为 Private 别人就看不到;你自己的项目、不想公开,强烈推荐 Private。
1、Private 到底有多"隐私"
- 只有你 + 你主动邀请的协作者才能看到、克隆、提交
- 不会出现在搜索结果、你的公开主页上
- 免费账号:无限私有仓库 ,每个仓库最多 3 个协作者(你自己不算)
- 传输、存储都是加密的,安全性足够个人/普通项目用
一句话:Private = 上锁的仓库,钥匙只在你手里。
2、什么时候推荐用 Private(你的情况正好符合)
✅ 推荐 Private:
- 个人练手、课程作业、毕设、实验代码
- 不想公开的半成品、乱糟糟的代码
- 含敏感配置(密钥、密码、数据库地址)
- 商业/竞赛/不想被抄袭的项目
❌ 不推荐 Private:
- 想做开源、积累作品集、让别人看你代码能力
- 需要多人协作(>3 人)且不想付费
你说"自己的项目、不想别人看到 " → 首选 Private,非常推荐。
3、上传到 Private 仓库的简单步骤(给你现成命令)
- GitHub 网页:New repo → 选 Private → 不要初始化 README → Create
- 本地(PowerShell):
bash
cd E:\0WHXY\keyan\versionFinally\handpose-virtualview
git init
git remote add origin https://github.com/你的用户名/你的仓库名.git
git add .
git commit -m "init: 上传个人项目"
git branch -M main
git push -u origin main
- 以后更新:
git add . && git commit -m "xxx" && git push - 安全提醒:千万别把密码/密钥提交上去 ,加到
.gitignore
四 .gitignore
1. .gitignore 到底是干嘛的?
是的!它的作用就是:让 Git 自动忽略某些文件/文件夹,永远不被跟踪、不被提交、不被推送到 GitHub。
你写什么进去,Git 就假装看不见它。
2. 为什么绝对不能把密码/密钥传到 GitHub?
因为:
- 一旦
push上去,就算你 later 删除了,历史记录里还能找到! - GitHub 会自动扫描并报警,密钥会立刻泄露
- 你的服务器、数据库可能被盗用
所以必须用 .gitignore 提前挡住!
3. 怎么防止密码/配置文件被提交?
第一步:在项目根目录新建一个文件
文件名就叫:
.gitignore
注意前面有个点 .
第二步:把要忽略的东西写进去
例如:
# 密钥、配置文件
config.json
secret.py
password.txt
.env
# 数据集、大文件
data/
dataset/
# 系统垃圾
.DS_Store
__pycache__/
*.pyc
*.pyo
*.pyd
# 虚拟环境
venv/
env/
.venv/
# 日志、权重
logs/
checkpoints/
*.pth
*.pt
*.ckpt
只要写进去,git 就永远不会提交它们。
4. 最关键的知识点(新手必懂)
✅ .gitignore 只对 从未被提交过的文件 生效
如果一个文件已经被 git add 或 commit 了
再写进 .gitignore 没用!
5. 你现在的项目怎么做最安全?(直接照做)
你现在是第一次上传 ,还没提交任何敏感文件,最安全!
直接在项目根目录创建 .gitignore,把这些写进去:
# Python 自动生成的文件
__pycache__/
*.py[cod]
*.so
# 虚拟环境
venv/
env/
.venv/
# 配置、密钥、环境变量
.env
config*.json
secret*
key*
password*
# 数据集、大模型文件
data/
dataset/
weights/
checkpoints/
*.pth
*.pt
*.pkl
*.h5
# 系统文件
.DS_Store
Thumbs.db
然后再执行:
bash
git add .
git commit -m "init"
git push
这样:
✅ 密码、密钥、数据集、大文件 永远不会上传
✅ GitHub 上看不到
✅ 非常安全
.gitignore = Git 的黑名单,写进去的文件永远不会被提交、不会被推送到 GitHub。
五、main和分支
1.除了 main,你可以建无数个分支
比如:
dev(开发)test(测试)feature/login(登录功能)wang(小王的分支)
想建多少建多少,互相不干扰。
2. 新建分支时,自带 main 的全部代码
新建分支 = 复制一份当前 main 的代码
比如你现在 main 里有:
你执行:
bash
git branch dev
那么:
✅ dev 分支里,一开始和 main 一模一样!
✅ 所有文件、所有代码、所有历史版本 完全相同
3. 之后你在 dev 上改代码,不会影响 main
这就是分支最牛的地方:
- 在
dev上写bug、乱写、测试 → main 完全不变 - 在
main上发布稳定版本 → dev 不受影响
两个分支各自独立往前走。
分支 = 代码的平行世界
- 刚创建时:和 main 完全一样
- 后来修改:只有部分代码不同
- 互相隔离:改一个不影响另一个
4. 最常用的分支操作(你马上就能用)
bash
# 查看当前有哪些分支
git branch
# 新建一个叫 dev 的分支(复制当前代码)
git branch dev
# 切换到 dev 分支
git checkout dev
# 新建并直接切换进去(最常用)
git checkout -b dev
分支 = 复制一份当前代码,让你随便改,不影响主版本。
刚建出来 = 和 main 一模一样
改完之后 = 只有你改动的地方不一样
六、 dev 分支合并回 main
1、合并的本质
把 dev 分支写的新代码 → 合并到 main 分支
合并后:
- main 会拥有 dev 的所有新代码
- dev 还在,不会消失
- 两个分支都保留
2、最标准、最安全的合并流程(直接照敲)
1)先切回 main
bash
git checkout main
2)保证 main 是最新的(避免冲突)
bash
git pull
3)把 dev 合并到 main
bash
git merge dev
4)推送到 GitHub(让云端也更新)
bash
git push
现在 main 分支已经拥有 dev 所有新代码了 ✅
切回main → 拉最新 → 合dev → 推云端
3、如果出现冲突(CONFLICT)怎么办?
冲突就是:
同一个文件,main 和 dev 改了同一行
解决方法超级简单:
- 打开报错的文件
- 找到
<<<<<<<和>>>>>>>之间的代码 - 手动删掉不要的,保留正确的
- 保存
然后:
bash
git add .
git commit -m "解决冲突"
git push
4、分支最常用 4 条命令(你必须记住)
bash
git branch # 看有哪些分支
git checkout dev # 切换到 dev
git checkout -b dev # 新建并切换到 dev
git merge dev # 把 dev 合并到当前分支
七、Git 和 SVN 的核心区别
Git = 分布式版本控制(每个人电脑都是完整仓库)
SVN = 集中式版本控制(只有服务器一个中央仓库)
1. 最本质区别(必懂)
SVN(集中式)
- 只有中央服务器有完整代码
- 你电脑上只有最新版本,没有历史
- 没网 → 不能提交、不能看历史、不能回退
- 服务器挂了 → 全团队瘫痪
Git(分布式)
- 每个人电脑都是一个完整仓库
- 包含所有历史、所有分支、所有版本
- 没网照样提交、回退、建分支、看历史
- 服务器挂了 → 不影响你本地开发
2. 断网能不能工作?(最大区别)
- SVN:断网 = 啥也干不了
- Git:断网 = 完全正常工作,有网再 push 上去
3. 分支功能对比
- SVN:分支极慢、极麻烦、很少用
- Git:分支秒建、秒切、超级轻量
你刚才学的 git checkout -b dev
SVN 要花几分钟,Git 只要 0.1 秒
4. 安全性
- SVN:服务器硬盘坏了 → 代码全没
- Git:每个人电脑都有完整备份 → 永远丢不了
5. 现在企业用哪个?
99% 公司都用 Git
GitHub、GitLab、Gitee、GitCode 全是 Git
SVN 基本只在老项目、旧公司见到
6. 超级大白话对比(最好记)
SVN 就像:只有一个U盘,大家轮流用
- 必须联网
- 断网不能用
- 坏了全完
- 分支难用
Git 就像:每人都有完整U盘副本
- 断网随便用
- 提交都在本地
- 服务器坏了不影响
- 分支超级强
Git 是分布式,本地有全部历史,断网能用,分支强大。
SVN 是集中式,必须联网,依赖中央服务器,分支弱。
现在所有新项目、所有大厂,全部用 Git!
八、 Branches & Tags
Tags(标签)就是给某个特定的提交版本,打一个永久的"版本号"标记,方便以后快速找到它,和分支是完全不同的东西。

1. 图里的信息
2 Branches:说明你仓库里有两个分支(main和dev),分支是动态的,会随着提交不断往前走。0 Tags:说明你还没有创建任何标签。
2. 分支 vs 标签,核心区别
| 概念 | 本质 | 特点 | 常见用途 |
|---|---|---|---|
| Branch(分支) | 可移动的指针 | 随着你不断 commit,会一直向前移动 |
开发、迭代、多人协作 |
| Tag(标签) | 固定的指针 | 一旦创建,永远指向同一个提交,不会变 | 标记发布版本,比如 v1.0、v2.1.3 |
举个例子:
- 你在
main分支上一直开发,提交了几十次,分支指针一直在往前跑。 - 当你觉得代码稳定、可以发布
v1.0版本时,就给当前这个提交打一个标签v1.0。 - 以后无论
main分支怎么更新,你都可以通过v1.0这个标签,直接找到当时发布的那版代码。
3. 最常用的标签命令(你现在就能试)
bash
# 给当前提交打一个版本标签(比如 v1.0)
git tag v1.0
# 查看所有标签
git tag
# 把标签推送到远程仓库
git push origin v1.0
推送成功后,你的 GitHub 仓库里就会显示 1 Tag 了。

4. 标签的两种类型(简单了解)
-
轻量标签(Lightweight) :就是一个简单的指针,只存提交哈希值,适合个人用。
bashgit tag v1.0 -
附注标签(Annotated) :会包含打标签的人、时间、备注信息,更正式,适合公开发布版本。
bashgit tag -a v1.0 -m "正式发布版本1.0"
九、Release & Tag
Release 就是专门基于 Tag 做的"正式发布页"。
先把关系讲清楚:
- Tag(v1.0):Git 里的一个"书签",指向某次提交,只有版本号和一句说明。
- Release :GitHub/GitLab 上的发布页面,必须绑定一个 Tag,可以写详细更新日志、上传安装包/压缩包、标为"正式版/预发布"。
一句话:Tag 是 Git 的概念;Release 是平台(GitHub)给 Tag 加的"发布包装"。
你现在的情况
你已经:
bash
git tag v1.0
git push origin v1.0
→ 远程已经有 v1.0 这个 tag 了。
接下来直接在 GitHub 把它变成 Release就行。
网页操作(最简单)
-
打开你的仓库主页
-
点右边 Releases → Draft a new release
-
Choose a tag 选
v1.0(你刚推的) -
填:
- Release title:比如
v1.0 正式版 - Describe this release:更新日志(修复了啥、加了啥)
- Release title:比如
-
可选:上传 zip/安装包(别人可以直接下载)
-
点 Publish release
→ 完事!现在别人能看到:
- 版本号 v1.0
- 详细更新日志
- 可下载的包
命令行方式(装了 GitHub CLI)
bash
gh release create v1.0 --title "v1.0 正式版" --notes "修复xx bug,新增xx功能"
常见疑问
- Q:必须先有 Tag 才能建 Release?
A:网页上可以"建 Release 同时自动建 Tag",但规范流程是先打 Tag 再建 Release。 - Q:一个 Tag 能对应多个 Release 吗?
A:不能,一个 Tag 只能有一个 Release。 - Q:删了 Tag 会怎样?
A:对应的 Release 也会被删掉。
十、worktree VS branch
分支 = 只能同时开一个窗口干活
worktree = 可以同时开多个窗口干活
1、用场景告诉你:没有 worktree 会有多痛苦
假设你正在 main 分支 写代码,写了一半:
场景 1:突然要紧急改 BUG
平时用分支:
- 你必须把当前写一半的代码 暂存 / 提交
- 切换到 bug 分支
- 改完
- 再切回 main,继续写一半的代码
麻烦死!
而且切换分支会清空文件夹、替换文件,容易乱。
场景 2:你想同时对比两个版本的代码
用分支:
- 切到 A → 看代码
- 切回 B → 看代码
- 不能同时打开!
用 worktree:
- 左边窗口打开 A
- 右边窗口打开 B
- 同时看、同时改、互不影响!
2、终极答案:worktree 到底解决什么?
解决:分支不能同时打开的问题!
分支的限制:
同一个 Git 仓库,同一时间只能打开一个分支
你切分支 → 文件夹内容会被替换掉
worktree 的能力:
给你多开一个独立文件夹
每个文件夹可以打开不同分支
同时编辑、同时运行、同时查看
分支 = 一台电视,换台就要切画面
worktree = 多台电视,同时看不同频道
你 main 分支写代码 → 窗口1
你想改 bug 分支 → 窗口2
两个窗口同时开,互不打扰,不用切换!
3、你在 Codex 里为什么会看到 worktree?
因为 Codex 子智能体(subagent)需要:
- 不影响你原来的代码
- 自己开一个独立环境做实验
- 同时运行多套代码
所以它必须用 worktree
分支做不到"同时打开"
分支是为了版本隔离
worktree 是为了【同时打开多个分支】而存在的
超级终极总结(你一定能懂)
- 分支 :我有好几个版本,但一次只能看一个
- worktree :我有好几个版本,我想同时打开、同时改