Git 中的仓库:什么是仓库、有哪些类型以及它们如何工作

作者: IT Sectr 发布日期: 2026-05-09 阅读时间: 8 分钟

Git 仓库 — 是项目源代码的存储库,Git 在其中跟踪整个开发过程中文件的每一次更改。仓库包含提交、分支和标签的完整历史记录,使开发人员能够协同处理代码。根据 Git,2024 的数据,仓库是任何版本控制系统的基础,并在全球数百万个项目中使用。

要点

  • Git 仓库 — 是带有 .git 服务文件夹的项目目录,所有更改历史都存储在其中。
  • 本地仓库位于开发人员的计算机上,允许在没有互联网连接的情况下处理代码。
  • 远程仓库托管在 GitHub、GitLab 或 Bitbucket 服务器上,用于参与者之间的同步。
  • Git将数据存储为文件的快照,而不是更改列表,这加快了分支和合并操作。
  • 版本控制系统解决了同时处理一个项目的问题,防止代码合并时发生冲突。

Git 中的仓库是什么

Git 仓库 — 是一种数据结构,版本控制系统在其中存储描述项目文件更改历史的元数据和对象。当开发人员使用 git init 命令初始化仓库时,Git 会在项目的根目录创建一个隐藏的 .git 文件夹。

这个文件夹中包含系统运行所需的所有对象、引用和配置文件。仓库不绑定到特定位置 — 开发人员可以在本地创建它,然后连接到远程服务器。

Git 使用分布式仓库模型:项目的每个参与者在其计算机上都有一份完整的历史副本。这意味着大多数操作 — 提交、查看历史、创建分支 — 都在本地执行,无需访问服务器。

根据 Git 文档,分布式架构使系统能够抵抗故障:如果服务器宕机,任何本地仓库都可以成为恢复项目完整历史的来源。

本地仓库和远程仓库

本地仓库 — 是开发人员计算机上的项目副本。它包含提交、分支和标签的完整历史记录,并允许在没有网络连接的情况下执行提交、分支、合并和变基操作。

远程仓库托管在服务器上,作为所有团队成员的同步点。开发人员使用 git push 命令发送他们的更改,并使用 git pull 命令获取其他人的更改。

本地仓库和远程仓库之间的连接通过 remote origin 配置 — 这是存储在 Git 配置中的服务器 URL。一个本地仓库可以连接到多个远程仓库,这在处理分支派生时非常有用。

这种模式的主要优点是开发人员可以在离线状态下处理代码,并且仅在准备好发送结果时才同步更改。

本地仓库和远程仓库的区别

特性本地远程
位置在开发人员的计算机上在服务器上(GitHub、GitLab)
无网络访问完全访问所有操作无连接时不可用
同步与远程推送/拉取接收本地的推送
备份不受数据丢失保护存储在服务器上并备份

Git 如何在仓库中存储数据

Git 的存储模型与其他版本控制系统有根本不同。Git 不存储版本之间的更改列表(增量),而是存储每次提交时所有项目文件的完整快照。

仓库中的每个对象由一个唯一的 40 字符长度 SHA-1 哈希标识。如果文件内容在提交之间没有更改,Git 不会创建新对象,而是重复使用现有对象 — 这节省了空间。

Git 使用四种对象类型:blob(文件内容)、tree(目录结构)、commit(带元数据的快照)和 tag(指向提交的命名引用)。所有对象都存储在 .git/objects 文件夹中。

根据 Git Internals,Git 的对象模型确保数据完整性:文件内容的任何更改都会产生新的哈希值,从而使得悄然修改历史变得不可能。

.git 文件夹的结构

.git 文件夹 — 是仓库的心脏。没有它,Git 无法跟踪更改,而普通目录只是一组文件。了解此文件夹的结构有助于诊断仓库问题。

  • objects/ — 仓库的所有对象:blobs、trees、commits、tags。以压缩形式存储。
  • refs/ — 指向提交的引用:heads(分支)、tags(标签)、remotes(远程分支)。
  • HEAD — 指向当前活动分支或提交的文件。
  • config — 仓库设置:远程 URL、用户名、电子邮件和其他参数。
  • index — 暂存区(索引),Git 在其中存储有关准备提交的文件的信息。
  • logs/ — 引用更新日志(reflog),存储 HEAD 和分支的移动历史。

HEAD 文件值得特别注意。在正常情况下,它包含对分支的符号引用,例如 ref: refs/heads/main。在分离 HEAD 状态下,它直接指向一个提交 — 这意味着新的提交将不会附加到任何分支。

仓库的基本操作

使用 Git 仓库 包括开发人员每天执行的一组基本操作。每个操作都更改仓库的状态,添加新对象或移动引用。

  • git init — 在当前目录创建一个新的空仓库。Git 创建带有初始结构的 .git 文件夹。
  • git clone — 将现有的远程仓库连同完整的提交历史记录一起复制到本地计算机。
  • git add — 将文件更改添加到暂存区(索引),准备提交。
  • git commit — 基于索引中的数据创建项目的快照,并将其保存为新的提交对象。
  • git push — 将新的提交从本地仓库发送到远程仓库,更新服务器上的分支。
  • git pull — 从远程仓库获取新的提交并将其与当前本地分支合并。

Pushpull 操作 — 是唯一需要连接到远程服务器的操作。所有其他操作完全在本地执行,即使在历史记录很大的情况下也能确保高工作速度。

仓库中文件的生命周期

仓库中的每个文件都经历四种状态:untracked(未跟踪)、modified(已修改)、staged(已暂存)和 committed(已提交)。Git 只跟踪通过 git add 显式添加或已经在提交历史中的文件。

理解这个模型 — 是高效使用 Git 的关键。开发人员可以选择性地只准备部分修改的文件进行提交,创建逻辑完整且描述清晰的提交。

远程仓库通常托管在提供 Web 界面、访问管理系统和协作开发附加工具的专业平台上。

  • GitHub — 最大的平台,拥有超过 1 亿个仓库。提供 Actions、Pull Requests、Issues 和 Wiki。公共项目免费。
  • GitLab — 具有集成 CI/CD、容器注册表和内置 DevOps 管道的平台。提供 SaaS 和自托管版本。
  • Bitbucket — Atlassian 的解决方案,集成 Jira 和 Trello。由于其灵活的访问设置,在企业环境中很受欢迎。

平台的选择取决于团队规模、隐私要求和所需的集成。对于移动开发,通常选择 GitHub,因为它有广泛的社区支持以及与 iOS 和 Android 的 CI/CD 工具的集成。

仓库使用命令示例

让我们考虑一个实际场景:开发人员克隆现有仓库,创建一个新分支,进行更改,然后将它们发送到服务器。每个命令都演示了与仓库不同组件的交互。

bash
# 克隆远程仓库
git clone https://github.com/user/mobile-app.git

# 进入项目目录
cd mobile-app

# 创建新的 feature 分支并切换到该分支
git checkout -b feature/auth

# 检查已修改文件的状态
git status

# 将所有更改添加到暂存区
git add .

# 创建带有描述的提交
git commit -m "Add authentication module"

# 将更改推送到远程仓库
git push origin feature/auth

git status 命令 — 日常工作中最有用的命令之一。它显示哪些文件已修改,哪些已准备提交,以及哪些完全不被 Git 跟踪。

查看提交历史

使用带有各种格式化标志的 git log 命令来分析仓库历史。它显示提交的时间顺序、提交者、日期和 SHA-1 标识符。

bash
# 查看带有分支图可视化的历史记录
git log --oneline --graph --all

# 查看特定提交中的更改
git show a1b2c3d

# 比较当前状态与上一次提交
git diff HEAD

# 查看特定文件的历史记录
git log --follow src/MainActivity.kt

--graph 标志显示分支的 ASCII 图谱,这在具有多个分支活跃工作的仓库中特别有用。对于发布频繁的移动项目,可视化图谱有助于快速评估开发结构。

常见问题

仓库和项目有什么区别?

仓库 — 是带有更改历史记录的代码技术存储库。项目 — 是一个更广泛的概念,包括仓库、任务管理系统、文档和开发流程。一个项目可能包含多个仓库。

如何在 GitHub 上创建仓库?

通过单击 New 按钮在 GitHub Web 界面中创建一个新的仓库。指定名称、描述和访问级别。然后将存储库克隆到本地计算机,或通过 git remote add origin 连接现有的本地仓库。

已删除的仓库能恢复吗?

如果远程仓库已从服务器中删除,但至少有一个开发人员拥有本地副本,则可以恢复该仓库。只需创建一个新的远程仓库,并从具有完整历史记录的本地副本执行 git push --force

什么是仓库的分支(Fork)?

Fork — 是他人仓库在您帐户上的副本。您将获得完整的历史记录副本,并且可以做出任何更改而不影响原始项目。Fork 用于通过 Pull Request 参与开源项目。

如何减小仓库大小?

使用 git gc 压缩对象并删除不可达的数据。通过 git filter-branchgit filter-repo 从历史记录中删除大文件。对于包含二进制文件的项目,请考虑 Git LFS(大文件存储)。

总结

  • Git 仓库 — 是带有完整更改历史记录的代码存储库,每个提交都是特定时刻所有项目文件的快照。
  • 本地仓库存储在开发人员的计算机上,无需网络连接即可支持全套 Git 操作。
  • 远程仓库通过推送和拉取同步团队工作,为所有参与者提供单一真实来源。
  • .git 文件夹包含所有服务信息:对象、分支引用、配置和 reflog 操作日志。
  • GitHub、GitLab 和 Bitbucket — 托管远程仓库并带有附加 CI/CD 工具的主要平台。
  • Git 的对象模型使用 SHA-1 哈希来标识每个对象,保证仓库数据的完整性。
  • 建议:每天至少提交一次,并在每个完成的工作阶段后与远程仓库同步。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读