Git: Git初始化仓库:git init命令详解与.git目录结构
Git仓库(Repository)是版本控制的核心,所有代码历史、分支、标签都存储在仓库中。本课详细讲解创建和管理仓库的方法。
1. Git仓库概述
Git仓库是包含项目所有文件及其完整历史记录的数据库。
(1) 什么是Git仓库?
Git仓库是一个包含项目文件和版本历史的目录,它具有以下特点:
- 完整历史:记录每次提交的完整快照
- 分支支持:可以创建多个并行开发线
- 分布式:每个仓库都是独立的,包含完整历史
- 高效存储:使用压缩和去重技术节省空间
(2) 仓库的两种创建方式
graph TB
A[创建Git仓库] --> B[git init<br/>从零创建新仓库]
A --> C[git clone<br/>复制远程仓库]
B --> D[空仓库<br/>需要手动添加文件]
C --> E[完整仓库<br/>包含所有历史]
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#fff4e1
两种方式的区别:
| 方式 | 命令 | 适用场景 | 是否包含历史 |
|---|---|---|---|
| 初始化 | git init |
创建新项目 | ❌ 空仓库 |
| 克隆 | git clone |
参与现有项目 | ✅ 完整历史 |
2. git init初始化仓库
git init命令将一个普通目录转换为Git仓库。
(1) 初始化流程
graph LR
A[创建目录] --> B[进入目录]
B --> C[运行 git init]
C --> D[创建 .git 目录]
D --> E[仓库创建成功]
style A fill:#e1f5ff
style E fill:#d4edda
(2) 基本用法
BASH
# 方式1:在现有目录中初始化
cd my-project
git init
# 方式2:创建并初始化新目录
git init my-project
▶ 示例:创建新仓库
BASH
# 步骤1:创建项目目录
mkdir my-project
# 步骤2:进入目录
cd my-project
# 步骤3:初始化Git仓库
git init
# 输出:
# Initialized empty Git repository in /path/to/my-project/.git/
# 步骤4:查看仓库状态
git status
# 输出:
# On branch main
# No commits yet
# nothing to commit (create/copy files and use "git add" to track)
# 步骤5:查看目录结构
ls -la
# 输出:
# total 0
# drwxr-xr-x 3 user group 4096 Jan 1 00:00 .
# drwxr-xr-x 3 user group 4096 Jan 1 00:00 ..
# drwxr-xr-x 7 user group 4096 Jan 1 00:00 .git
(3) 在现有项目中初始化
如果已有项目文件,可以直接在项目目录中初始化:
BASH
# 进入现有项目目录
cd existing-project
# 初始化Git仓库
git init
# 查看状态(所有现有文件都是未跟踪状态)
git status
# 输出:
# Untracked files:
# src/
# README.md
# package.json
💡 提示:
git init不会修改现有文件,只是创建.git目录。所有现有文件都会变成未跟踪(Untracked)状态。
3. .git目录结构
.git目录是Git仓库的核心,存储所有版本控制信息。
(1) 目录结构详解
TEXT
📖 仅展示
.git/
├── HEAD # 当前分支指针
├── config # 本地配置文件
├── description # 仓库描述(供GitWeb使用)
├── hooks/ # 钩子脚本目录
│ ├── pre-commit.sample
│ └── post-commit.sample
├── info/ # 附加信息
│ └── exclude # 本地忽略规则
├── objects/ # 所有数据对象(提交、树、文件)
│ ├── info/
│ └── pack/
├── refs/ # 引用(分支、标签)
│ ├── heads/ # 本地分支
│ └── tags/ # 标签
└── index # 暂存区信息(文件)
(2) 重要文件说明
| 文件/目录 | 说明 | 示例内容 |
|---|---|---|
| HEAD | 指向当前分支 | ref: refs/heads/main |
| config | 本地配置 | 远程仓库地址、用户信息等 |
| objects/ | 存储所有数据对象 | 提交、树、文件快照(压缩存储) |
| refs/heads/ | 本地分支指针 | 每个分支一个文件,内容为提交哈希 |
| refs/tags/ | 标签指针 | 每个标签一个文件 |
| index | 暂存区信息 | 记录暂存区的文件状态 |
▶ 示例:查看.git目录
BASH
# 步骤1:查看.git目录内容
ls -la .git
# 输出:
# -rw-r--r-- 1 user group 23 Jan 1 00:00 HEAD
# -rw-r--r-- 1 user group 137 Jan 1 00:00 config
# -rw-r--r-- 1 user group 73 Jan 1 00:00 description
# drwxr-xr-x 2 user group 4096 Jan 1 00:00 hooks
# drwxr-xr-x 2 user group 4096 Jan 1 00:00 info
# drwxr-xr-x 4 user group 4096 Jan 1 00:00 objects
# drwxr-xr-x 4 user group 4096 Jan 1 00:00 refs
# 步骤2:查看HEAD文件
cat .git/HEAD
# 输出:ref: refs/heads/main
# 步骤3:查看配置文件
cat .git/config
# 输出:
# [core]
# repositoryformatversion = 0
# filemode = true
# bare = false
# logallrefupdates = true
# 步骤4:查看分支目录
ls -la .git/refs/heads
# 输出:(初始为空,创建提交后会有main文件)
(3) objects目录详解
objects目录存储Git的所有数据对象,采用SHA-1哈希作为文件名:
TEXT
📖 仅展示
objects/
├── 4a/ # 哈希前2位作为目录名
│ └── 8b2f... # 哈希后38位作为文件名
├── info/
└── pack/ # 打包存储(节省空间)
对象类型:
- Blob:文件内容
- Tree:目录结构
- Commit:提交信息
- Tag:标签信息
⚠️ 注意: 不要手动修改
.git目录中的文件,除非你非常清楚自己在做什么!错误的修改可能导致仓库损坏。
4. git clone克隆仓库
git clone命令用于复制远程仓库到本地。
(1) 克隆的作用
克隆会完成以下操作:
- 下载完整历史:包括所有提交、分支、标签
- 创建本地仓库:在本地生成
.git目录 - 自动关联远程:创建名为
origin的远程引用 - 检出默认分支:通常是
main或master
(2) 克隆命令语法
BASH
# 基本语法
git clone <仓库地址>
# 克隆到指定目录
git clone <仓库地址> <目录名>
# 浅克隆(只克隆最近N次提交)
git clone --depth <深度> <仓库地址>
# 克隆单个分支
git clone -b <分支名> --single-branch <仓库地址>
▶ 示例:克隆GitHub仓库
BASH
# 方式1:使用HTTPS克隆(推荐新手)
git clone https://github.com/user/repo.git
# 输出:
# Cloning into 'repo'...
# remote: Enumerating objects: 100, done.
# remote: Counting objects: 100% (100/100), done.
# remote: Compressing objects: 100% (80/80), done.
# remote: Total 100 (delta 20), reused 100 (delta 20), pack-reused 0
# Receiving objects: 100% (100/100), done.
# Resolving deltas: 100% (20/20), done.
# 方式2:使用SSH克隆(需要配置SSH密钥)
git clone git@github.com:user/repo.git
# 方式3:克隆到指定目录
git clone https://github.com/user/repo.git my-project
# 方式4:浅克隆(只克隆最近1次提交,速度快)
git clone --depth 1 https://github.com/user/repo.git
# 步骤:验证克隆结果
cd repo
git remote -v
# 输出:
# origin https://github.com/user/repo.git (fetch)
# origin https://github.com/user/repo.git (push)
(3) 克隆后的目录结构
graph TB
A[远程仓库<br/>github.com/user/repo] --> B[git clone]
B --> C[本地仓库]
C --> D[.git 目录<br/>完整历史+远程配置]
C --> E[项目文件<br/>默认分支的最新版本]
D --> F[origin 远程引用]
style A fill:#e1f5ff
style C fill:#d4edda
💡 提示: 克隆会自动创建远程关联
origin,指向原仓库地址。可以使用git remote -v查看。
5. 仓库状态查看
git status是查看仓库当前状态的基本命令。
(1) 文件状态类型
graph LR
A[文件状态] --> B[未跟踪<br/>Untracked]
A --> C[已修改<br/>Modified]
A --> D[已暂存<br/>Staged]
A --> E[已提交<br/>Committed]
B -->|git add| D
C -->|git add| D
D -->|git commit| E
E -->|修改文件| C
style B fill:#fff3cd
style C fill:#ffe6e6
style D fill:#d4edda
style E fill:#c3e6cb
(2) 状态说明表
| 状态 | 英文名称 | 说明 | 下一步操作 |
|---|---|---|---|
| 未跟踪 | Untracked | 新文件,Git未跟踪 | git add 添加到暂存区 |
| 已修改 | Modified | 已跟踪文件被修改,未暂存 | git add 添加到暂存区 |
| 已暂存 | Staged | 已添加到暂存区,准备提交 | git commit 提交 |
| 已提交 | Committed | 已提交到本地仓库 | 继续工作或推送 |
▶ 示例:查看仓库状态
BASH
# 步骤1:初始化仓库
mkdir demo && cd demo
git init
# 步骤2:查看初始状态(空仓库)
git status
# 输出:
# On branch main
# No commits yet
# nothing to commit (create/copy files and use "git add" to track)
# 步骤3:创建新文件
echo "# Demo Project" > README.md
# 步骤4:查看状态(未跟踪)
git status
# 输出:
# On branch main
# No commits yet
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# README.md
# nothing added to commit but untracked files present
# 步骤5:添加到暂存区
git add README.md
# 步骤6:查看状态(已暂存)
git status
# 输出:
# On branch main
# No commits yet
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
# new file: README.md
# 步骤7:提交
git commit -m "Initial commit"
# 步骤8:查看状态(干净)
git status
# 输出:
# On branch main
# nothing to commit, working tree clean
(3) 状态简览
使用-s选项可以查看简洁的状态输出:
BASH
git status -s
# 输出示例:
# M modified-file.txt # 已修改(左侧M表示暂存区,右侧M表示工作区)
# A new-file.txt # 已暂存的新文件
# ?? untracked-file.txt # 未跟踪文件
❓ 常见问题
Q git init和git clone有什么区别?
A git init创建全新的空仓库,适合新项目;git clone复制现有的远程仓库(包含完整历史记录),适合参与已有项目。
Q 可以删除.git目录吗?
A 可以,但会删除所有版本历史!删除后目录变成普通目录,不再是Git仓库。只有确定不再需要版本历史时才能删除。
Q 如何在已有文件的目录中初始化仓库?
A 直接在目录中运行
git init,Git不会修改现有文件,只是创建.git目录。所有现有文件都会变成未跟踪状态。Q 克隆仓库很慢怎么办?
A 可以使用浅克隆
git clone --depth 1 <地址>,只克隆最近一次提交,速度更快。适合只需要最新代码、不需要历史的场景。📖 小节
- Git仓库是版本控制的核心,包含项目文件和完整历史记录
- 创建仓库有两种方式:
git init(新建)和git clone(克隆) .git目录存储所有版本控制信息,包括HEAD、config、objects、refs等- 克隆会下载完整历史、创建本地仓库、自动关联远程origin
- 文件有四种状态:未跟踪、已修改、已暂存、已提交
- 使用
git status查看仓库状态,了解文件处于哪个阶段
📝 作业
-
基础题(难度⭐):创建一个名为
my-first-repo的Git仓库,查看.git目录结构,并解释HEAD文件的作用。 -
进阶题(难度⭐⭐):在仓库中创建README.md和src目录,使用
git status观察文件状态变化,记录每个状态对应的含义。 -
挑战题(难度⭐⭐⭐):克隆一个GitHub公开仓库(如https://github.com/octocat/Hello-World.git),查看远程配置(
git remote -v),并解释origin的含义和作用。