Git 的核心工作流程(三区域模型)

Git 的核心工作流程(三区域模型)

Git 的核心可以理解为 三个区域 的协作:

复制代码
工作区 (Working Directory) → 暂存区 (Staging Area) → 版本库 (Repository)
      (你正在编辑的文件)         (准备提交的文件)         (已保存的版本历史)

1. 工作区 (Working Directory)

  • 是什么:就是你电脑上能看到的项目文件夹
  • 内容:你正在编辑、修改、创建的文件
  • 特点:这些修改还没有被 Git 跟踪记录

2. 暂存区 (Staging Area / Index)

  • 是什么:一个中间区域,就像"购物车"
  • 作用:选择哪些修改要进入下一个版本
  • 命令git add 将文件放入暂存区

3. 版本库 (Repository)

  • 是什么:Git 的数据库,存储所有版本历史
  • 内容:提交记录、分支、标签等
  • 命令git commit 将暂存区内容永久保存

可视化理解

复制代码
┌─────────────────┐    git add     ┌─────────────────┐    git commit    ┌─────────────────┐
│                 │ ──────────────> │                 │ ───────────────> │                 │
│   工作区         │                │   暂存区         │                  │   版本库         │
│  (Working Dir)  │ <────────────── │  (Staging Area) │                  │  (Repository)   │
│                 │    git restore  │                 │                  │                 │
└─────────────────┘                 └─────────────────┘                  └─────────────────┘
       │                                                                          │
       │ 编辑文件                                                                  │ git checkout
       ↓                                                                          ↓
┌─────────────────┐                                                      ┌─────────────────┐
│ 文件修改状态       │                                                      │ 历史版本         │
│ - 修改了file.txt  │                                                      │ - commit abc123 │
│ - 新增了image.jpg │                                                      │ - commit def456 │
└─────────────────┘                                                      └─────────────────┘

分支 (Branch) 的概念

什么是分支?

  • 比喻:就像游戏中的存档点,你可以创建多个不同的游戏进度
  • 实质:只是一个指向某个提交的可移动指针

分支的工作原理

复制代码
main分支:    A --- B --- C --- D
                \
feature分支:      E --- F --- G
  • main 分支指向提交 D
  • feature 分支指向提交 G
  • 两个分支共享历史提交 A、B、C

常用的分支策略

bash 复制代码
# 查看所有分支
git branch -a

# 创建新分支
git branch feature-xyz

# 切换分支
git checkout feature-xyz
# 或者
git switch feature-xyz

# 创建并切换分支
git checkout -b feature-xyz

# 合并分支
git checkout main
git merge feature-xyz

# 删除分支
git branch -d feature-xyz

如何分辨不同状态的文件

文件在 Git 中的四种状态

复制代码
┌─────────────────────────────────────────────────────────────────────┐
│                         工作区 (Working Directory)                   │
│                                                                     │
│  ┌─────────────┐    git add       ┌─────────────┐    git commit     │
│  │ 未跟踪       │ ───────────────> │ 已暂存       │ ───────────────> │ 已提交 │
│  │ (Untracked) │                  │ (Staged)    │                  │ (Committed) │
│  └─────────────┘ <─────────────── └─────────────┘                  └─────────────┘
│                 git rm --cached                                    │
│                                                                     │
│  ┌─────────────┐                                                    │
│  │ 已修改       │ ────┐                                              │
│  │ (Modified)  │     │ git add                                      │
│  └─────────────┘     └──────────────────────────────────────────────┘
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

查看文件状态

bash 复制代码
# 查看详细状态
git status

# 输出示例:
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:          # 暂存区中的文件(绿色)
  (use "git restore --staged <file>..." to unstage)
        modified:   README.md
        new file:   src/utils.js

Changes not staged for commit:    # 工作区中已修改但未暂存的文件(红色)
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   package.json

Untracked files:                  # 未跟踪的新文件(红色)
  (use "git add <file>..." to include in what will be committed)
        config.ini

状态分辨技巧

  1. git status 颜色区分

    • 🟢 绿色:已在暂存区,准备提交
    • 🔴 红色:在工作区,未暂存
    • 🔴 红色(Untracked):新文件,从未被 Git 跟踪
  2. 使用 git diff

    bash 复制代码
    # 比较工作区和暂存区的差异
    git diff
    
    # 比较暂存区和最新提交的差异
    git diff --staged
    
    # 比较两个分支的差异
    git diff main..feature

实际工作流程示例

场景:修复一个 bug

bash 复制代码
# 1. 确保在main分支
git checkout main

# 2. 创建新分支
git checkout -b fix-bug-123

# 3. 编辑文件(工作区修改)
vim src/app.js

# 4. 查看状态
git status  # 显示src/app.js是modified状态(红色)

# 5. 添加到暂存区
git add src/app.js
git status  # 现在src/app.js是绿色,准备提交

# 6. 提交到版本库
git commit -m "修复bug #123"

# 7. 切换回main分支并合并
git checkout main
git merge fix-bug-123

# 8. 推送到远程仓库
git push origin main

# 9. 删除临时分支
git branch -d fix-bug-123

重要概念对比

工作区 vs 暂存区 vs 版本库

区域 内容 修改命令 回退命令
工作区 当前编辑的文件 直接编辑文件 git restore <file>
暂存区 准备提交的文件 git add git restore --staged <file>
版本库 已提交的历史 git commit git reset

分支 vs 标签 (Tag)

  • 分支:会随着新的提交而移动的指针
  • 标签:指向特定提交的固定指针(通常用于版本发布)

实用技巧和最佳实践

1. 经常检查状态

bash 复制代码
git status
git log --oneline --graph --all  # 查看提交历史图

2. 使用 .gitignore

创建 .gitignore 文件来排除不需要版本控制的文件:

复制代码
# 忽略日志文件
*.log

# 忽略依赖文件夹
node_modules/
vendor/

# 忽略系统文件
.DS_Store
Thumbs.db

3. 提交信息规范

使用清晰的提交信息:

复制代码
feat: 添加用户登录功能
fix: 修复内存泄漏问题
docs: 更新API文档
style: 调整代码格式

4. 分支命名规范

  • feature/用户认证
  • bugfix/登录错误
  • hotfix/紧急修复
  • release/v1.2.0

常见问题排查

我修改了文件,但 git status 没显示?

  • 文件可能被 .gitignore 排除了
  • 或者文件还没有被 git add 过(未跟踪状态)

如何撤销修改?

bash 复制代码
# 撤销工作区的修改(危险!会丢失修改)
git restore <file>

# 从暂存区撤回文件(保留工作区修改)
git restore --staged <file>

# 撤销最近的一次提交
git reset --soft HEAD~1

如何查看文件在不同区域的内容?

bash 复制代码
# 查看工作区文件
cat file.txt

# 查看暂存区文件
git show :file.txt

# 查看最新提交中的文件
git show HEAD:file.txt

# 查看特定提交中的文件
git show abc123:file.txt

Git 的这些概念一开始可能有些复杂,但一旦理解了三个区域的工作流程和分支机制,你就会发现它其实非常直观和强大。多练习几次常见的操作流程,很快就能熟练掌握。