---
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命令分类整理]]