Git 工作流程完全解析

基础
视频演示

Git 工作流程完全解析

📚 目录

  1. Commit vs Push 的区别
  2. 完整工作流程
  3. 分支合并详解
  4. 实际例子

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. 并行开发

    • 多人可以同时开发不同功能
    • 互不干扰
  2. 功能隔离

    • 新功能在独立分支开发
    • 不影响主分支的稳定性
  3. 版本管理

    • 可以回到任意版本
    • 可以创建发布分支

分支操作流程

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 的三个区域

  1. 工作区(Working Directory)

    • 你正在编辑的文件
    • git status 显示红色 = 已修改但未暂存
  2. 暂存区(Staging Area)

    • 准备提交的文件
    • git add 后进入这里
    • git status 显示绿色 = 已暂存
  3. 本地仓库(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 是远程操作!