当前位置: 首页 > 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;绿色计划的目的是开发一种能够在各种消费性电子产品&…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...