.git
文件夹的原理实现这些功能的。GitHub 是一个基于 Git 的远程托管服务,提供了代码协作的中心化远程仓库(裸仓库)。作为服务器角色,GitHub 的仓库主要作用包括:
一个典型的 GitHub 仓库地址可能是:
https://github.com/username/repository.git
裸仓库(bare repository):GitHub 的仓库是一个“裸仓库”,它不包含工作区,只有
.git
文件夹。它的作用是作为“中央存储”,提供给其他开发者的本地仓库进行交互。
本地仓库是每个开发者在自己机器上的独立仓库。每个本地仓库都包含一个 .git
文件夹,负责存储:
特点:即使没有网络,本地仓库也可以独立工作,比如提交代码、查看历史、创建分支等。
在 Git 的分布式设计中:
git pull
从远程仓库拉取代码,通过 git push
将本地更改推送到远程仓库。简单来说:
接下来,我们通过一个具体的例子展示 GitHub 远程仓库和本地仓库之间的交互过程,涵盖初始化、版本管理和同步等操作。
example-repo
。https://github.com/username/example-repo.git
此时,远程仓库为空,但它可以作为一个 服务器,等待本地仓库的交互。
git clone https://github.com/username/example-repo.git
克隆操作会完成以下几件事情:
克隆完成后,本地仓库结构:
example-repo/
├── .git/ # 存储版本历史和配置信息
└── (空目录) # 工作区,目前没有任何文件
本地仓库的角色:
- 创建一个与远程仓库连接的本地仓库。
- 将远程仓库的 `.git` 文件夹复制到本地,并保存到新的目录 `example-repo/` 中。
- 设置远程仓库的别名为 `origin`,存储在本地 `.git/config` 文件中。
- 本地仓库是 **客户端**,它从远程仓库获取初始代码(在此例中是一个空仓库)。
README.md
文件:echo "# Example Repository" > README.md
- 添加文件到暂存区:
git add README.md
- 提交到本地仓库:
git commit -m "Add README.md"
.git
文件夹中:特点:
- **Blob 对象**:保存 `README.md` 文件的内容。
- **Tree 对象**:保存当前目录结构。
- **Commit 对象**:保存提交的元信息(提交信息、父提交指针、指向 Tree 的指针)。
- 此时,本地仓库可以完全独立于远程仓库工作,即使没有网络也能完成版本管理操作。
本地仓库作为 客户端,将提交推送到远程仓库(服务器):
git push origin main
- `origin`:表示远程仓库的别名。
- `main`:表示本地分支。
README.md
文件和完整的提交历史。如果当前本地仓库与Github仓库同步,则需先拉取Github仓库,然后再进行推送。
当其他开发者在远程仓库上提交代码时,本地仓库可以拉取这些更改:
git pull origin main
- 本地仓库从远程仓库获取最新的分支信息和提交。
- Git 会合并这些更改到本地分支。
.git
文件夹管理自己的版本控制数据。refs/
和 objects/
存储分支状态和完整的历史版本,确保每个客户端都可以获取一致的数据。.git
文件夹独立管理版本历史,能够在离线状态下完成提交、回滚等操作。git pull
和 git push
与远程仓库同步,确保代码协作的高效性。