[Git] 深入理解 Git 的客户端与服务器角色

Git 的一个核心设计理念是 分布式,每个 Git 仓库都可以既是 客户端,也可以是 服务器。为了更好地理解这一特性,我们通过一个实际的 GitHub 远程仓库和本地仓库的场景来详细说明 Git 如何在客户端和服务器之间协作,如何独立地进行版本管理,以及它是如何通过 .git 文件夹的原理实现这些功能的。


1. GitHub 远程仓库和本地仓库的关系

1.1 什么是 GitHub 远程仓库?

GitHub 是一个基于 Git 的远程托管服务,提供了代码协作的中心化远程仓库(裸仓库)。作为服务器角色,GitHub 的仓库主要作用包括:

  • 存储项目的完整版本历史:所有的提交、分支、标签信息都可以从远程仓库访问。
  • 协作开发:开发者可以通过远程仓库同步代码,提交自己的更改或获取他人的更新。

一个典型的 GitHub 仓库地址可能是:

https://github.com/username/repository.git

裸仓库(bare repository):GitHub 的仓库是一个“裸仓库”,它不包含工作区,只有 .git 文件夹。它的作用是作为“中央存储”,提供给其他开发者的本地仓库进行交互。


1.2 什么是本地仓库?

本地仓库是每个开发者在自己机器上的独立仓库。每个本地仓库都包含一个 .git 文件夹,负责存储:

  • 项目的完整版本历史。
  • 从远程仓库拉取的分支、提交信息。
  • 开发者本地的更改和分支。

特点:即使没有网络,本地仓库也可以独立工作,比如提交代码、查看历史、创建分支等。


1.3 客户端和服务器的角色切换

在 Git 的分布式设计中:

  • 本地仓库作为客户端:本地仓库通过 git pull 从远程仓库拉取代码,通过 git push 将本地更改推送到远程仓库。
  • 远程仓库作为服务器:远程仓库接收本地仓库的更改,并将更新提供给其他客户端(开发者)。

简单来说:

  • GitHub 是 服务器,提供远程托管服务。
  • 本地仓库是 客户端,通过网络与服务器交互,同时在本地独立工作。

2. Git 客户端与服务器交互:完整操作流程

接下来,我们通过一个具体的例子展示 GitHub 远程仓库和本地仓库之间的交互过程,涵盖初始化、版本管理和同步等操作。


2.1 创建 GitHub 远程仓库

  1. 登录 GitHub,创建一个新的仓库,命名为 example-repo
  2. GitHub 提供了仓库的克隆地址,例如:
https://github.com/username/example-repo.git

此时,远程仓库为空,但它可以作为一个 服务器,等待本地仓库的交互。


2.2 本地仓库克隆远程仓库

  1. 在本地打开终端,运行以下命令克隆远程仓库:
git clone https://github.com/username/example-repo.git

克隆操作会完成以下几件事情:

克隆完成后,本地仓库结构:

example-repo/
├── .git/    # 存储版本历史和配置信息
└── (空目录)  # 工作区,目前没有任何文件

本地仓库的角色

- 创建一个与远程仓库连接的本地仓库。
- 将远程仓库的 `.git` 文件夹复制到本地,并保存到新的目录 `example-repo/` 中。
- 设置远程仓库的别名为 `origin`,存储在本地 `.git/config` 文件中。
- 本地仓库是 **客户端**,它从远程仓库获取初始代码(在此例中是一个空仓库)。

2.3 本地仓库独立工作(客户端独立性)

  1. 在本地创建文件和提交:
    • 创建一个 README.md 文件:
echo "# Example Repository" > README.md
- 添加文件到暂存区:
git add README.md
- 提交到本地仓库:
git commit -m "Add README.md"
  1. 提交完成后,所有的版本历史信息被存储在 .git 文件夹中:

特点

- **Blob 对象**:保存 `README.md` 文件的内容。
- **Tree 对象**:保存当前目录结构。
- **Commit 对象**:保存提交的元信息(提交信息、父提交指针、指向 Tree 的指针)。
- 此时,本地仓库可以完全独立于远程仓库工作,即使没有网络也能完成版本管理操作。

2.4 推送本地更改到 GitHub

本地仓库作为 客户端,将提交推送到远程仓库(服务器):

  1. 使用以下命令推送更改:
git push origin main
- `origin`:表示远程仓库的别名。
- `main`:表示本地分支。
  1. 推送完成后,远程仓库(GitHub 服务器)接收到提交,并更新其分支状态。GitHub 上的仓库现在包含 README.md 文件和完整的提交历史。

如果当前本地仓库与Github仓库同步,则需先拉取Github仓库,然后再进行推送。


2.5 从 GitHub 拉取更改

当其他开发者在远程仓库上提交代码时,本地仓库可以拉取这些更改:

  1. 使用以下命令同步远程代码:
git pull origin main
- 本地仓库从远程仓库获取最新的分支信息和提交。
- Git 会合并这些更改到本地分支。

2.6 Git 服务器与客户端的分布式特性

  1. 客户端的独立性
    • 即使远程仓库不可用,本地仓库也可以完全独立工作,进行提交、创建分支等操作。
    • 本地仓库通过 .git 文件夹管理自己的版本控制数据。
  2. 服务器的多客户端支持
    • 多个开发者可以从同一个远程仓库克隆代码,并推送自己的更改。
    • 服务器通过 refs/objects/ 存储分支状态和完整的历史版本,确保每个客户端都可以获取一致的数据。

3. 总结:通过 GitHub 理解 Git 的客户端与服务器角色

  1. 远程仓库(服务器)
    • GitHub 的远程仓库是一个裸仓库,主要存储版本历史和分支信息,供多个客户端访问。
    • 它的核心功能是协作和数据共享,提供代码托管服务。
  2. 本地仓库(客户端)
    • 本地仓库通过 .git 文件夹独立管理版本历史,能够在离线状态下完成提交、回滚等操作。
    • 本地仓库通过 git pullgit push 与远程仓库同步,确保代码协作的高效性。
  3. 分布式特性
    • Git 的每个仓库(无论是本地还是远程)都可以既是客户端又是服务器。这种平等性和独立性是 Git 设计的核心亮点。
    • 通过 GitHub 作为远程仓库,我们更直观地感受到了 Git 的强大分布式协作能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于考研概率论知识解读 Transformer:为何自注意力机制要除以根号 dk

Transformer自注意力机制中除以 d k \sqrt{d_k} dk​ ​深度剖析 【 Transformer 系列,故事从 d k \sqrt{d_k} dk​ ​说起】 LLM这么火,Transformer厥功甚伟,某天心血来潮~,再去看看! 它长这个样子: 深入…

使用 selenium-webdriver 开发 Web 自动 UI 测试程序

优缺点 优点 有时候有可能一个改动导致其他的地方的功能失去效果,这样使用 Web 自动 UI 测试程序可以快速的检查并定位问题,节省大量的人工验证时间 缺点 增加了维护成本,如果功能更新过快或者技术更新过快,维护成本也会随之提高…

【Redis】初识分布式系统

目录 单机架构 分布式系统 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 冷热分离架构 垂直分库 微服务架构 分布式名词概念 本篇博文,将根据分布式系统的演进一步一步介绍每一种架构的形式,最后为大家总结了一些分布式中常用的…

微服务之松耦合

参考:https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…

pytest+request+yaml+allure搭建低编码调试门槛的接口自动化框架

接口自动化非常简单,大致分为以下几步: 准备入参调用接口拿到2中response,继续组装入参,调用下一个接口重复步骤3校验结果是否符合预期 一个优秀接口自动化框架的特点: 【编码门槛低】,又【能让新手学到…

基于Springboot + vue实现的文档管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径,并设置同步映射(1)配置服务器的系统环境(2)配置服务器的conda环境 4 进入到程序入口(main.py&#…

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK(Acknowledge) 2. NACK(Not Acknowledge) IO口模拟II2C协议 发送起始信号: 发送停止信号: 检测应答信号: 发送应答信号&#x…

Excel 技巧07 - 如何计算到两个日期之间的工作日数?(★)如何排除节假日计算两个日期之间的工作日数?

本文讲了如何在Excel中计算两个日期之间的工作日数,以及如何排除节假日计算两个日期之间的工作日数。 1,如何计算到两个日期之间的工作日数? 其实就是利用 NETWORKDAYS.INTL 函数 - weekend: 1 - 星期六,星期日 2,如…

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们,技术图文创作很不容易…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》,让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识,顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话,可以看看博主的C语言专栏哟&#xff…

智能物流升级利器——SAIL-RK3576核心板AI边缘计算网关设计方案(一)

近年来,随着物流行业智能化和自动化水平不断提升,数据的实时处理与智能决策成为推动物流运输、仓储管理和配送优化的重要手段。传统的集中式云平台虽然具备强大计算能力,但高延迟和带宽限制往往制约了物流现场的即时响应。为此,我…

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

【MySQL】简单解析一条SQL查询语句的执行过程

1. MySQL 的逻辑架构图 MySQL 架构主要分为 Server 层和存储引擎层。Server 层集成了连接器、查询缓存、分析器、优化器和执行器等核心组件&#xff0c;负责提供诸如日期、时间、数学和加密等内置函数&#xff0c;以及实现存储过程、触发器、视图等跨存储引擎的功能。存储引擎层…

如何将json字符串格式化

文章目录 如何对json字符串进行格式化显示hutool方案的示例和不足使用fastjson的方案 如何对json字符串进行格式化显示 将json字符串内容进行格式化的输出显示。本文介绍 hutool的方案和alibaba 的fastjson方案 hutool方案的示例和不足 引入依赖 <dependency><grou…

复杂 C++ 项目堆栈保留以及 eBPF 性能分析

在构建和维护复杂的 C 项目时&#xff0c;性能优化和内存管理是至关重要的。当我们面对性能瓶颈或内存泄露时&#xff0c;可以使用eBPF&#xff08;Extended Berkeley Packet Filter&#xff09;和 BCC&#xff08;BPF Compiler Collection&#xff09;工具来分析。如我们在Red…

unity学习18:unity里的 Debug.Log相关

目录 1 unity里的 Debug.log相关 2 用Debug.DrawLine 和 Debug.DrawRay画线 2.1 画线 1 unity里的 Debug.log相关 除了常用的 Debug.Log&#xff0c;还有另外2个 Debug.Log("Debug.Log"); Debug.LogWarning("Debug.LogWarning"); Debug.LogErro…

IoTDB 常见问题 QA 第三期

关于 IoTDB 的 Q & A IoTDB Q&A 第三期持续更新&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;查询最新值 & null 数据相加方…

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…