Git: Git初始化仓库:git init命令详解与.git目录结构

Git仓库(Repository)是版本控制的核心,所有代码历史、分支、标签都存储在仓库中。本课详细讲解创建和管理仓库的方法。

1. Git仓库概述

Git仓库是包含项目所有文件及其完整历史记录的数据库。

(1) 什么是Git仓库?

Git仓库是一个包含项目文件和版本历史的目录,它具有以下特点:

(2) 仓库的两种创建方式

100%
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) 初始化流程

100%
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/        # 打包存储(节省空间)

对象类型:

⚠️ 注意: 不要手动修改.git目录中的文件,除非你非常清楚自己在做什么!错误的修改可能导致仓库损坏。


4. git clone克隆仓库

git clone命令用于复制远程仓库到本地。

(1) 克隆的作用

克隆会完成以下操作:

  1. 下载完整历史:包括所有提交、分支、标签
  2. 创建本地仓库:在本地生成.git目录
  3. 自动关联远程:创建名为origin的远程引用
  4. 检出默认分支:通常是mainmaster

(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) 克隆后的目录结构

100%
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) 文件状态类型

100%
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 <地址>,只克隆最近一次提交,速度更快。适合只需要最新代码、不需要历史的场景。

📖 小节


📝 作业

  1. 基础题(难度⭐):创建一个名为my-first-repo的Git仓库,查看.git目录结构,并解释HEAD文件的作用。

  2. 进阶题(难度⭐⭐):在仓库中创建README.md和src目录,使用git status观察文件状态变化,记录每个状态对应的含义。

  3. 挑战题(难度⭐⭐⭐):克隆一个GitHub公开仓库(如https://github.com/octocat/Hello-World.git),查看远程配置(git remote -v),并解释origin的含义和作用。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏