当前位置: 首页 > news >正文

深入理解Git

目录

一、Git 的基本构造

1.1 关键对象类型

1.2 存储机制

二、Git 的内部工作

2.1 哈希和数据完整性

2.2 引用和可达性

2.3 分支和合并

2.4 垃圾回收

三、Git 高级特性

3.1 垃圾回收

3.2 钩子(Hooks)

3.3 子模块

四、常用命令

五、最佳实践


Git,作为当代软件开发中最受欢迎的版本控制系统,其强大功能背后是一套复杂而精妙的存储原理和内部机制。理解这些原理不仅能帮助开发者更有效地使用 Git,还能提升对整个软件开发流程的理解。本文将深入探讨 Git 的存储原理和内部机制,揭示它如何管理和维护代码历史。

一、Git 的基本构造

Git 的设计哲学是以快照的形式存储数据,而非文件差异比较。每次提交时,Git 实际上是在创建项目状态的快照。这一点与其他版本控制系统存在根本区别。

1.1 关键对象类型

在 Git 中,数据存储和管理依赖于四种主要的对象类型:

  1. Blob(二进制大对象):每个文件的内容存储在一个 blob 对象中。重要的是,blob 对象只包含文件数据,不包含任何文件名或目录结构信息。

  2. Tree:tree 对象代表目录结构。它可以指向一组 blob 对象(文件)和其他 tree 对象(子目录),从而形成项目的层次结构。

  3. Commit:commit 对象包含指向特定 tree 对象的指针(代表项目在某一时刻的快照),以及该提交的元数据,如作者、日期、父提交等。

  4. Tag:tag 对象用于标记特定的提交(例如,作为版本发布点),提供了一种固定引用到特定提交的方法。

1.2 存储机制

Git 使用内容寻址文件系统,这意味着文件和目录的存储基于它们内容的哈希值。具体来说,Git 对每个文件内容计算 SHA-1 哈希值,并以此作为 blob 对象的唯一标识。这种方法不仅确保了数据的一致性和完整性,还允许 Git 高效地重用相同内容的文件,节约存储空间。

二、Git 的内部工作

理解 Git 如何在内部处理数据对于高效使用它至关重要。

2.1 哈希和数据完整性

Git 依赖于 SHA-1 哈希来保证数据完整性。每个对象(不论是 blob、tree 还是 commit)都有一个与其内容对应的唯一哈希值。任何内容的微小更改都会导致哈希值发生变化,从而提供一种自然的数据完整性检查机制。

2.2 引用和可达性

Git 中的“引用”(例如分支和标签)指向特定的提交。一个对象(提交、树、blob)的“可达性”是通过引用和提交历史来确定的。只要从任何现存引用出发,通过递归的父提交关系能够找到某个对象,就认为这个对象是“可达的”。不可达的对象(例如,通过 git reset 丢弃的提交)可能会在垃圾回收过程中被删除。

2.3 分支和合并

在 Git 中,分支本质上是指向特定提交的轻量级指针。创建新分支时,Git 只是创建了一个新的指针,而不会复制任何实际的文件数据。合并操作通常涉及到比较两个分支的差异,并生成一个新的合并提交。

2.4 垃圾回收

随着时间的推移,Git 仓库中可能会积累大量不再需要的对象。Git 的垃圾回收机制负责清理这些不再需要的对象,优化仓库的性能。

三、Git 高级特性

3.1 垃圾回收

随着时间的推移,Git 仓库会积累不再需要的对象。Git 的垃圾回收机制能够清理这些对象,优化仓库性能。

3.2 钩子(Hooks)

Git 钩子是自动化脚本,它们在执行重要 Git 操作(如提交、推送)时触发。钩子可用于代码审查、自动部署等任务。

3.3 子模块

Git 子模块允许将一个 Git 仓库作为另一个仓库的子目录。这对于管理依赖关系和大型项目非常有用。

四、常用命令

  1. 配置用户信息

    git config --global user.name "Your Name" git config --global user.email "your_email@example.com"

  2. 初始化仓库

    git init # 在当前目录初始化新的Git仓库

  3. 克隆仓库

    git clone <repository_url> # 克隆远程仓库

  4. 添加文件到暂存区

    git add <file> # 添加指定文件 git add . # 添加当前目录的所有更改

  5. 提交更改

    git commit -m "Commit message" # 提交暂存区的更改

  6. 查看状态

    git status # 查看工作目录和暂存区状态

  7. 查看提交历史

    git log # 查看提交历史

  8. 创建分支

    git branch <branch_name> # 创建新分支

  9. 切换分支

    git checkout <branch_name> # 切换到指定分支 git checkout -b <new_branch> # 创建并切换到新分支

  10. 合并分支

    git merge <branch_name> # 将指定分支合并到当前分支

  11. 推送到远程仓库

    git push origin <branch_name> # 推送当前分支到远程仓库

  12. 拉取远程仓库的更改

    git pull # 拉取并合并远程仓库的更改

五、最佳实践

有效使用 Git 的关键在于遵循一些最佳实践:

  • 频繁提交:经常提交可以帮助您保持工作进度的记录。
  • 清晰的提交信息:编写清晰、具体的提交信息。
  • 合理使用分支:为新功能或修复创建新的分支。
  • 定期拉取和推送:保持与远程仓库的同步。
  • 使用 .gitignore:排除不需要版本控制的文件。
  • 避免重写公共历史:不在公共分支上使用 git rebasegit push --force

相关文章:

深入理解Git

目录 一、Git 的基本构造 1.1 关键对象类型 1.2 存储机制 二、Git 的内部工作 2.1 哈希和数据完整性 2.2 引用和可达性 2.3 分支和合并 2.4 垃圾回收 三、Git 高级特性 3.1 垃圾回收 3.2 钩子&#xff08;Hooks&#xff09; 3.3 子模块 四、常用命令 五、最佳实践…...

Leetcode_203.移除链表元素—C语言

目录 ❣️1.题目❣️ ❣️2.解答❣️ &#x1f49e;方法一&#xff1a;暴力法 &#x1f49e;方法二&#xff1a; 尾插法 &#x1f49e;方法三&#xff1a;哨兵位法 ❣️1.题目❣️ 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.va…...

虹科方案 | 汽车电子电气架构设计仿真解决方案

来源&#xff1a;虹科汽车电子 虹科方案 | 汽车电子电气架构设计仿真解决方案 导读 本文将介绍面向服务&#xff08;SOA&#xff09;的汽车TSN网络架构&#xff0c;并探讨RTaW-Pegase仿真与设计软件在TSN网络设计中的应用。通过RTaW将设计问题分解&#xff0c;我们可以更好地理…...

Java6种单例模式写法

单例模式 某个类任何情况下只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。Java6种单例模式&#xff1a;2种懒汉式&#xff0c;2种饿汉式 &#xff0c;静态内部类 &#xff0c;枚举类懒汉式 synchronized延迟加载 public class Singleton {private static Sing…...

Direct3D拾取

假设在屏幕上单击&#xff0c;击中的位置为点s(x,y)。由图可以看出&#xff0c;用户选中了茶壶。但是仅给出点s&#xff0c;应用程序还无法立即判断出茶壶是否被选中。所以针对这类问题&#xff0c;我们需要采用一项称为“拾 取(Picking)”的技术。 茶壶和屏幕点s之间的一种联…...

大洋钻探系列之二IODP 342航次是干什么的?(上)

本文简单介绍一下大洋钻探IODP 342航次&#xff0c;从中&#xff0c;我们一窥大洋钻探航次的风采。 IODP342的航次报告在网络上可以下载&#xff0c;英文名字叫《Integrated Ocean Drilling ProgramExpedition 342 Preliminary Report》&#xff0c;航次研究的主要内容是纽芬兰…...

离散时间系统模型

离散时间系统模型 离散时间系统模型是表示数字滤波器的方案。MATLAB 科学计算环境支持若干种离散时间系统模型&#xff0c;这些模型将在以下章节中介绍&#xff1a; ​传递函数零极点增益状态空间部分分式展开式&#xff08;残差形式&#xff09;二阶节 (SOS)格型结构体卷积矩…...

Nginx学习(在 Docker 中使用 Nginx)

1. 安装Nginx 使用 docker pull nginx 下载最新的 Nginx Docker 镜像。 下载完毕后&#xff0c;使用 docker run -d -p 80:80 --name nginx nginx&#xff0c;即可启动 Nginx 容器。其中&#xff0c;-p 80:80 表示将容器的 80 端口映射到 主机的 80 端口&#xff1b;--name ng…...

【Java】集合(一)单列集合List

1.集合 可以动态保存任意多个对象&#xff0c;并提供了一系列的操作对象的方法&#xff1a;add、remove、set、get等。 2.集合框架体系 分为两大类&#xff1a; 单列集合和双列集合 3.List接口基本介绍 List接口是Collection接口的子接口 List集合类中元素有序&#xff0…...

实战 | 基于卷积神经网络的蘑菇识别微信小程序

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.11.13 Last edited: 2023.11.13 导读&#xff1a;其实没啥难的&#xff0c;主要是随手搞了就发出来把&#xff0c;太久没有水过帖子了&…...

如何选择共享wifi项目服务商,需要注意哪些?

在移动互联网时代&#xff0c;无线网络已经成为人们生活中不可或缺的一部分。随着5G时代的到来&#xff0c;共享WiFi项目成为了市场上备受关注的焦点。在众多共享WiFi公司中&#xff0c;如何选择共享wifi项目服务商合作&#xff0c;今天我们就来盘点下哪些公司可靠&#xff01;…...

ubuntu20.04 MYNTEYE S 相机运行与标定记录

ubuntu20.04 MYNTEYE S 相机运行与标定记录 环境 ubuntu20.04 opencv3.3.1 硬件 mynteye S1030 OpenCV 3.4.3 安装 Jetson Nano小觅相机(MYNT EYE S)开发调试指南 mkdir -p ~/tools/opencv cd ~/tools/opencvgit clone https://github.com/opencv/opencv.git cd opencv/…...

有效降低数据库存储成本方案与实践 | 京东云技术团队

背景 随着平台的不断壮大&#xff0c;业务的不断发展&#xff0c;后端系统的数据量、存储所使用的硬件成本也逐年递增。从发展的眼光看&#xff0c;业务与系统要想健康的发展&#xff0c;成本增加的问题必须重视起来。目前业界普遍认同开源节流大方向&#xff0c;很多企业部门…...

分布式数据库Schema 变更 in F1 TiDB

分布式数据库Schema 变更 in F1 & TiDB 【转载】TiDB 源码阅读系列文章&#xff08;十七&#xff09;DDL 源码解析 | PingCAP 上述文章主要叙述了从DDL语句发起到执行的过程&#xff0c;简单介绍了弄一套相同的模式来后台处理数据回填&#xff0c;从而提高DDL的并发度的一…...

图形库篇 | EasyX | 图像处理

图形库篇 | EasyX | 图像处理 图像类型 IMAGE表示图像,用于定义一个图像变量,与导入的图片资源一一对应。 IMAGE img;加载与绘制图像 函数功能函数加载图像void loadimage(IMAGE* pDstImg,LPCTSTR pImgFile,int nwidth = 0,int nHeight = 0,bool bResize = false)绘制图像v…...

AWTK UI 自动化测试工具发布

AWTK UI 自动化 提供了兼容 Appium 的接口&#xff0c;可以使用 Appium 的工具来进行 UI 自动化测试。但是使用起来有点麻烦&#xff0c;用的人不多&#xff0c;所以最终决定开发一个 AWTK 专用的 UI 自动化测试工具。相比 Appium&#xff0c;这个工具有下列特点&#xff1a; …...

Java后端开发——JDBC入门实验

JDBC&#xff08;Java Database Connectivity&#xff09;是Java编程语言中用于与数据库建立连接并进行数据库操作的API&#xff08;应用程序编程接口&#xff09;。JDBC允许开发人员连接到数据库&#xff0c;执行各种操作&#xff08;如插入、更新、删除和查询数据&#xff09…...

LCA

定义 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 性质 如果 不为 的祖先并且 不为 的祖先&#xff0c;那么 分别处于 的两棵不同子树中&#…...

ts学习02-数据类型

新建index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </h…...

javaSE的发展历史以及openjdk和oracleJdk

1 JavaSE 的发展历史 1.1 Java 语言的介绍 SUN 公司在 1991 年成立了一个称为绿色计划&#xff08;Green Project&#xff09;的项目&#xff0c;由 James Gosling&#xff08;高斯林&#xff09;博士领导&#xff0c;绿色计划的目的是开发一种能够在各种消费性电子产品&…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...