当前位置: 首页 > news >正文

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

常用的分支策略

# 查看所有分支
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

状态分辨技巧

  1. git status 颜色区分

    • 🟢 绿色:已在暂存区,准备提交
    • 🔴 红色:在工作区,未暂存
    • 🔴 红色(Untracked):新文件,从未被 Git 跟踪
  2. 使用 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 addgit restore --staged <file>
版本库已提交的历史git commitgit 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 的这些概念一开始可能有些复杂,但一旦理解了三个区域的工作流程和分支机制,你就会发现它其实非常直观和强大。多练习几次常见的操作流程,很快就能熟练掌握。

http://www.dtcms.com/a/358279.html

相关文章:

  • github同一台电脑支持两个或以上的ssh账户(macos或Linux系统),解决Key is already in use问题
  • 医院排班|医护人员排班系统|基于springboot医护人员排班系统设计与实现(源码+数据库+文档)
  • 苍穹外卖Day7 | 缓存商品、购物车、SpringCache、缓存雪崩、缓存套餐
  • SpringCloud Alibaba微服务--Sentinel的使用
  • docker 部署Skywalking
  • 基于大模型与 PubMed 检索的光谱数据分析系统
  • 大语言模型的“可解释性”探究——李宏毅大模型2025第三讲笔记
  • Java类加载与JVM详解:从基础到双亲委托机制
  • idea 普通项目转换成spring boot项目
  • Python实现半角数字转全角数字的完整教程
  • 《中国棒垒球》垒球世界纪录多少米·垒球8号位
  • Visual Studio(vs)免费版下载安装C/C++运行环境配置
  • LeetCode 287.寻找重复数
  • Java试题-选择题(23)
  • 【LeetCode 热题 100】62. 不同路径——(解法四)组合数学
  • 聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集
  • rhel-server-7.9-x86_64-dvd.iso
  • 机器学习中KNN算法介绍
  • 笔记共享平台|基于Java+vue的读书笔记共享平台系统(源码+数据库+文档)
  • 数据库原理及应用_数据库基础_第3章数据库编程_常用系统函数
  • 骑行商城怎么开发
  • 【金仓数据库产品体验官】KingbaseES-ORACLE兼容版快速体验
  • 国家统计局数据分析01——机器学习
  • GD32VW553-IOT 基于 vscode 的 bootloader 移植(基于Cmake)
  • 【DreamCamera2】相机应用修改成横屏后常见问题解决方案
  • 阿里云营业执照OCR接口的PHP实现与技术解析:从签名机制到企业级应用
  • LZ4 解压工具(WPF / .NET 8)说明书
  • Java Stream API并行流性能优化实践指南
  • 基于Kubernetes自定义调度器的资源隔离与性能优化实践指南
  • 从 0 到 1 构建零丢失 RabbitMQ 数据同步堡垒:第三方接口数据零丢失的终极方案