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
分支指向提交 Dfeature
分支指向提交 G- 两个分支共享历史提交 A、B、C
常用的分支策略
# 查看所有分支
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 │
│ └─────────────┘ └──────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────┘
查看文件状态
# 查看详细状态
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.mdnew file: src/utils.jsChanges 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.jsonUntracked files: # 未跟踪的新文件(红色)(use "git add <file>..." to include in what will be committed)config.ini
状态分辨技巧
-
git status
颜色区分:- 🟢 绿色:已在暂存区,准备提交
- 🔴 红色:在工作区,未暂存
- 🔴 红色(Untracked):新文件,从未被 Git 跟踪
-
使用
git diff
:# 比较工作区和暂存区的差异 git diff# 比较暂存区和最新提交的差异 git diff --staged# 比较两个分支的差异 git diff main..feature
实际工作流程示例
场景:修复一个 bug
# 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. 经常检查状态
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
过(未跟踪状态)
如何撤销修改?
# 撤销工作区的修改(危险!会丢失修改)
git restore <file># 从暂存区撤回文件(保留工作区修改)
git restore --staged <file># 撤销最近的一次提交
git reset --soft HEAD~1
如何查看文件在不同区域的内容?
# 查看工作区文件
cat file.txt# 查看暂存区文件
git show :file.txt# 查看最新提交中的文件
git show HEAD:file.txt# 查看特定提交中的文件
git show abc123:file.txt
Git 的这些概念一开始可能有些复杂,但一旦理解了三个区域的工作流程和分支机制,你就会发现它其实非常直观和强大。多练习几次常见的操作流程,很快就能熟练掌握。