--- title: "02-git基本概念" created: 2025-11-25 tags: - 项目 aliases: - git基本概念 --- # git基本概念 工作区:仓库的目录。工作区是独立于各个分支的。 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。 版本库:存放所有已经提交到本地仓库的代码版本 版本结构:树结构,树中每个节点代表一个代码版本。 ## 四大工作区域与流转 Git 的整体架构可以划分为**本地三区 + 远程一区**: ```mermaid flowchart LR A["工作区
Working Directory"] -->|"git add"| B["暂存区
Staging Area / Index"] B -->|"git commit"| C["本地版本库
Repository (.git)"] C -->|"git push"| D["远程仓库
Remote Repository"] D -->|"git fetch / git pull"| C C -->|"git checkout / git restore"| A ``` - **工作区**:你正在编辑的项目目录,改动对 Git 而言是"未登记"的。 - **暂存区**:`git add` 后改动进入暂存区,决定"下次 commit 带上哪些内容"——这是 Git 区别于很多 VCS 的设计,允许把一次大改动拆成多次精准提交。 - **本地版本库**:`git commit` 后版本永久记录在 `.git` 目录中,形成树状历史。 - **远程仓库**:托管在 GitHub / GitLab / Gitee 等平台,是团队协作的同步枢纽。 一次完整的日常循环:**编辑(工作区)→ add(暂存区)→ commit(本地库)→ push(远程库)**;反向的 pull 则是"fetch + merge",把远程新版本拉下来合并进本地。 ## 文件的三种状态(生命周期) 从文件视角看,一个文件在 Git 中处于三种状态之间流转: | 状态 | 含义 | 进入方式 / 转移命令 | | --- | --- | --- | | 已修改(Modified) | 工作区改了文件,还没放到暂存区 | 编辑文件;用 `git restore` 撤销 | | 已暂存(Staged) | 已 `git add`,下次提交会包含它 | `git add`;`git restore --staged` 退回 | | 已提交(Committed) | 已安全存入本地版本库 | `git commit` | 另有一类特殊状态 **Untracked(未跟踪)**:新建的文件还没被 `git add` 过,Git 对它"视而不见",不纳入版本管理。 ## 本地仓库与远程仓库 - **本地仓库**:项目目录下隐藏的 `.git` 文件夹就是本地仓库本体,包含全部历史版本、暂存区、分支与配置信息——拷贝这个文件夹,整个仓库就带走了。 - **远程仓库**:托管在网络上的仓库副本,本地通过 `remote` 机制与之关联。约定俗成把第一个远程命名为 **origin**(`git remote add origin `)。 - **协作模型**:Git 是**分布式**版本控制——每个开发者本地都有完整仓库(含全部历史),远程仓库只是多人同步的"中转站",即使离线也能提交、查看历史、建分支,联网后再 push/pull 同步。 ## HEAD 与分支 - **提交(commit)**:版本树中的一个节点,记录了完整快照、作者、时间与指向上一个提交的指针。 - **分支**:本质上是指向某个提交的**可移动指针**。默认主分支为 `master`(如今 GitHub 新仓库多用 `main`)。创建分支只是创建一个指针,所以 Git 建分支几乎零成本。 - **HEAD**:指向"当前所在提交"的指针,通常指向当前分支的最新节点。`git checkout` / `git switch` 切换分支本质就是移动 HEAD;回滚历史(`git reset`)本质是把分支指针和 HEAD 指回旧节点。 ## 术语速查 | 术语 | 含义 | | --- | --- | | 仓库(repository / repo) | 被 Git 管理的项目目录(含 `.git`) | | origin | 远程仓库的默认别名 | | clone | 把远程仓库完整下载到本地 | | add / commit | 工作区 → 暂存区 → 本地版本库 | | push / pull / fetch | 与远程仓库同步的三个动作 | | merge / rebase | 合并分支的两种方式(合并 vs 变基) | | conflict(冲突) | 两个分支修改了同一处代码,需人工裁决 | | .gitignore | 声明不纳入版本管理的文件清单 | --- **项目分区导航**:[[01-Git与GitHub入门|01-Git与GitHub入门]] ⬅️ | 02-git基本概念 | ➡️ [[03-git命令分类整理|git命令分类整理]]