Git 工作流程完全解析
基础
视频演示
Git 工作流程完全解析
📚 目录
Commit vs Push 的区别
核心区别
| 操作 | 作用范围 | 存储位置 | 是否影响远程 |
|---|---|---|---|
| Commit | 本地 | 你的电脑(.git 文件夹) | ❌ 不影响 |
| Push | 远程 | 服务器(GitHub/GitLab) | ✅ 影响远程 |
详细说明
Commit(提交)
git commit -m "Update app"作用:
- ✅ 将你的修改保存到本地仓库
- ✅ 创建一条提交记录
- ✅ 存储在你的电脑的
.git文件夹中 - ❌ 不会上传到服务器
- ❌ 其他人看不到
类比:
- 就像你在本地写日记,保存到你的笔记本里
- 只有你能看到,别人看不到
Push(推送)
git push origin main作用:
- ✅ 将你的本地提交上传到服务器
- ✅ 同步到远程仓库(GitHub/GitLab)
- ✅ 其他人可以看到
- ✅ 团队可以拉取你的代码
类比:
- 就像你把日记发布到网上
- 所有人都能看到
完整工作流程
流程图
工作区(Working Directory)
↓ git add
暂存区(Staging Area)
↓ git commit
本地仓库(Local Repository)
↓ git push
远程仓库(Remote Repository)
详细步骤
步骤 1: 修改文件(工作区)
# 你修改了文件
vim app.py
# 文件现在在工作区(Working Directory)状态:
- 文件已修改
- 但 Git 还没有追踪这个修改
git status会显示:modified: app.py(红色)
步骤 2: 添加到暂存区(Staging Area)
git add app.py
# 或
git add . # 添加所有修改的文件作用:
- 将修改的文件添加到暂存区
- 告诉 Git:"这些文件我准备提交了"
git status会显示:modified: app.py(绿色)
暂存区是什么?
- 一个中间区域
- 你可以选择性地添加文件
- 只有添加到暂存区的文件才会被提交
步骤 3: 提交到本地仓库(Commit)
git commit -m "Update app.py"作用:
- 将暂存区的文件提交到本地仓库
- 创建一条提交记录
- 保存到你的电脑的
.git文件夹中 - 此时代码还在你的电脑上,没有上传到服务器
提交后:
- 你的修改已保存到本地仓库
- 可以查看提交历史:
git log - 但其他人还看不到
步骤 4: 推送到远程仓库(Push)
git push origin main作用:
- 将你的本地提交上传到服务器
- 同步到远程仓库(GitHub/GitLab)
- 此时其他人可以看到你的代码
推送后:
- 你的代码在服务器上
- 团队成员可以
git pull获取你的代码 - 可以在 GitHub/GitLab 上看到你的提交
完整流程示例
例子:修改代码并提交
# 1. 修改文件(工作区)
vim app.py
# 添加了一行代码:print("Hello")
# 2. 查看状态
git status
# 输出:
# modified: app.py (红色,表示已修改但未暂存)
# 3. 添加到暂存区
git add app.py
git status
# 输出:
# modified: app.py (绿色,表示已暂存)
# 4. 提交到本地仓库
git commit -m "Add hello message"
# 输出:
# [main abc1234] Add hello message
# 1 file changed, 1 insertion(+)
# 5. 查看提交历史(本地)
git log --oneline
# 输出:
# abc1234 Add hello message
# def5678 Previous commit
# ...
# 6. 推送到远程仓库
git push origin main
# 输出:
# Counting objects: 3, done.
# Writing objects: 100% (3/3), done.
# To https://github.com/user/repo.git
# def5678..abc1234 main -> main
# 7. 现在其他人可以看到你的代码了状态变化图
修改文件前:
工作区: app.py (旧版本)
暂存区: 空
本地仓库: app.py (旧版本)
远程仓库: app.py (旧版本)
↓ 修改文件
修改文件后(git add 前):
工作区: app.py (新版本) ← 你修改的
暂存区: 空
本地仓库: app.py (旧版本)
远程仓库: app.py (旧版本)
↓ git add
添加到暂存区后:
工作区: app.py (新版本)
暂存区: app.py (新版本) ← 准备提交
本地仓库: app.py (旧版本)
远程仓库: app.py (旧版本)
↓ git commit
提交到本地仓库后:
工作区: app.py (新版本)
暂存区: 空
本地仓库: app.py (新版本) ← 已提交
远程仓库: app.py (旧版本) ← 还没上传
↓ git push
推送到远程仓库后:
工作区: app.py (新版本)
暂存区: 空
本地仓库: app.py (新版本)
远程仓库: app.py (新版本) ← 已上传,其他人可以看到
分支合并详解
什么是分支?
分支 = 代码的独立开发线
主分支(main): A → B → C
↓
功能分支(feature): A → B → D → E
- 主分支:稳定的代码
- 功能分支:开发新功能
为什么需要分支?
-
并行开发
- 多人可以同时开发不同功能
- 互不干扰
-
功能隔离
- 新功能在独立分支开发
- 不影响主分支的稳定性
-
版本管理
- 可以回到任意版本
- 可以创建发布分支
分支操作流程
1. 创建分支
# 从当前分支创建新分支
git checkout -b feature/login
# 或
git branch feature/login
git checkout feature/login结果:
main: A → B → C
↓
feature/login: A → B → C (新分支,指向同一个提交)
2. 在新分支开发
# 切换到新分支
git checkout feature/login
# 修改代码
vim login.py
git add .
git commit -m "Add login feature"结果:
main: A → B → C
↓
feature/login: A → B → C → D (新提交)
3. 合并分支
# 切换回主分支
git checkout main
# 合并功能分支
git merge feature/login结果:
main: A → B → C → D (合并后的主分支)
↓ ↑
feature/login: A → B → C → D
合并的三种情况
情况 1: 快进合并(Fast-forward)
主分支: A → B
功能分支: A → B → C → D
合并后:
主分支: A → B → C → D (直接移动指针)
特点:
- 主分支没有新提交
- Git 直接移动指针
- 最简单,无冲突
情况 2: 三方合并(3-way merge)
主分支: A → B → E
功能分支: A → B → C → D
合并后:
主分支: A → B → E → M (合并提交)
↓ ↑
功能分支: A → B → C → D
特点:
- 主分支有新提交
- Git 创建合并提交
- 可能需要解决冲突
情况 3: 有冲突的合并
主分支: A → B → E (修改了 app.py 第10行)
功能分支: A → B → C → D (也修改了 app.py 第10行)
合并时:
- Git 无法自动合并
- 产生冲突
- 需要手动解决
完整工作流程示例
例子:开发新功能
# 1. 从主分支创建功能分支
git checkout main
git pull # 确保主分支是最新的
git checkout -b feature/user-profile
# 2. 在新分支开发
vim user_profile.py
git add .
git commit -m "Add user profile page"
# 3. 继续开发
vim user_profile.css
git add .
git commit -m "Add user profile styles"
# 4. 查看提交历史
git log --oneline
# 输出:
# def5678 Add user profile styles
# abc1234 Add user profile page
# xyz9876 Previous commit (来自 main)
# 5. 切换回主分支
git checkout main
# 6. 确保主分支是最新的
git pull
# 7. 合并功能分支
git merge feature/user-profile
# 8. 如果有冲突,解决冲突
# git add .
# git commit
# 9. 推送到远程
git push origin main
# 10. 删除本地功能分支(可选)
git branch -d feature/user-profile状态变化图
初始状态:
main: A → B
feature/user-profile: (不存在)
↓ git checkout -b feature/user-profile
创建分支后:
main: A → B
feature/user-profile: A → B (指向同一个提交)
↓ 在新分支开发并提交
开发后:
main: A → B
feature/user-profile: A → B → C → D
↓ git checkout main
↓ git merge feature/user-profile
合并后:
main: A → B → C → D (合并了功能分支)
feature/user-profile: A → B → C → D
↓ git push origin main
推送后:
远程 main: A → B → C → D (其他人可以看到)
关键概念总结
Git 的三个区域
-
工作区(Working Directory)
- 你正在编辑的文件
git status显示红色 = 已修改但未暂存
-
暂存区(Staging Area)
- 准备提交的文件
git add后进入这里git status显示绿色 = 已暂存
-
本地仓库(Local Repository)
- 已提交的代码
git commit后进入这里- 存储在
.git文件夹中
Commit vs Push
| 操作 | 位置 | 作用 | 影响范围 |
|---|---|---|---|
| git add | 工作区 → 暂存区 | 选择要提交的文件 | 本地 |
| git commit | 暂存区 → 本地仓库 | 保存到本地 | 本地 |
| git push | 本地仓库 → 远程仓库 | 上传到服务器 | 远程 |
分支合并
- 创建分支:
git checkout -b feature/name - 切换分支:
git checkout branch-name - 合并分支:
git merge branch-name - 删除分支:
git branch -d branch-name
最佳实践
推荐的工作流程
# 1. 开始工作前
git checkout main
git pull # 拉取最新代码
# 2. 创建功能分支
git checkout -b feature/new-feature
# 3. 开发
# 修改代码...
git add .
git commit -m "Add feature"
# 4. 继续开发(可以多次提交)
git add .
git commit -m "Update feature"
# 5. 切换回主分支
git checkout main
git pull # 再次拉取最新代码
# 6. 合并功能分支
git merge feature/new-feature
# 7. 解决冲突(如果有)
# 8. 推送到远程
git push origin main记住
- ✅ Commit = 保存到本地(你的电脑)
- ✅ Push = 上传到服务器(其他人可以看到)
- ✅ 分支 = 独立的开发线
- ✅ 合并 = 将分支的代码合并到主分支
快速参考
常用命令
# 查看状态
git status
# 添加文件
git add <文件>
git add . # 添加所有文件
# 提交
git commit -m "消息"
# 推送
git push origin main
# 拉取
git pull
# 创建分支
git checkout -b feature/name
# 切换分支
git checkout branch-name
# 合并分支
git merge branch-name
# 查看提交历史
git log --oneline记住:Commit 是本地操作,Push 是远程操作!