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

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.xdnf.cn/news/19129.html

相关文章:

  • 第四章:大模型(LLM)】08.Agent 教程-(11)构建历史与数据分析协作系统
  • Kafka 主题级配置从创建到优化
  • 第二十六天-ADC基本原理
  • 一个wordpress的网站需要什么样的服务器配置
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(七)
  • 本地运行的检索PDF文件中出现关键字的python程序
  • Coze源码分析-API授权-编辑令牌-后端源码
  • K8s服务日志收集方案文档
  • 【90页PPT】新能源汽车数字化转型SAP解决方案(附下载方式)
  • (纯新手教学)计算机视觉(opencv)实战十——轮廓特征(轮廓面积、 轮廓周长、外接圆与外接矩形)
  • Redis 缓存热身(Cache Warm-up):原理、方案与实践
  • docker,mysql安装
  • 35.Ansible的yaml语法与playbook的写法
  • 嵌入式Linux I2C驱动开发
  • 从零到一:使用Flask构建“我的笔记”网站
  • [光学原理与应用-337]:ZEMAX - 自带的用于学习的样例设计
  • LeetCode100-240搜索二维矩阵Ⅱ
  • Mysql常用函数
  • 针对 “TCP 会话维持与身份验证” 的攻击
  • LabVIEW测斜设备承压试验台
  • SQL学习记录
  • 使用git bash ,出现Can‘t get terminal settings: The handle is invalid. 的解决方法与思路
  • 【OpenGL ES】光栅化插值原理和射线拾取原理
  • 把 AI 塞进「智能跳绳」——基于 MEMS 传感器的零样本卡路里估算器
  • [HFCTF2020]EasyLogin
  • UCIE Specification详解(九)
  • 平安养老险深分开展“金融护航,安居鹏城”新市民金融服务宣传活动
  • React Native 初体验
  • LeetCode 完全背包 279. 完全平方数
  • 任意函数都有原像