Git系列——Git理论

news2024/11/16 16:36:34

概述

Git 是一个开源的分布式版本控制系统, 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git没有中央版本库的概念,每个客户端都可成为版本库,内部采用全量方式对文件的每次提交建立快照并存储(若文件内容变化产生重新存储)。

Git存储的文件命名规则采用SHA-1算法对文件内容计算而来,计算结果是一个40字符的串字符串,前2位表示文件夹名,后面38位表示对象名,所以每个文件对应的对象只要内容不一样,对象不会重复。

Git将文件内容是按元数据方式存储,不像其他版本管理工具采用文件和增量(例如SNV、CVS)。

下面从如下几个方面介绍下其相关理论:

1、基本概念

2、对象模型

3、内部组织

4、文件状态

5、工作流

6、通信协议

1、基本概念

HEAD: 当前版本的指针,当切换本地版本的时候会快速指向指定版本文件

master:Git默认创建的主分支

origin: Git默认创建的远程仓库的名称

工作区:本地电脑里的目录。

暂存区(stage 或 index):一般存放在 .git 目录下的 index 文件(.git/index)中,所以有时也叫作索引(index)。

本地版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

远程版本库:存在于另一台电脑上的Git版本库,一般都是服务器(Git服务器),服务器上只有裸库,没有工作区。

注意:为了区别本地和远程版本库,所以本地就叫本地版本库,远程就叫远程版本库,对于Git本身二者一样。在实际生产应用中, 一般大家为了集中管理和共享代码,都会建立一个共享代码库(俗称:远程中央仓库)。

对象:Git内部存储都是以一系列对象为单位进行存储,然后通过一定逻辑规则,将对象联系在一起。

目录树:Git内部的文件组织结构,主要包括如下一些核心目录及文件,例如:

.git:git内部组织。

工作区:平时的工作目录,.git目录也位于该目录下。

.git/hooks:存放一些其他脚本,用于扩展Git的功能,Git引擎会自动执行存放于该目录的相应脚本,用以扩展Git的功能。

.git/info:存放仓库的一些基本信息。

.git/logs:该目录包括每个分支的历史,包括提交的父子关系、分支的重置、分支的合并、分支的重命名等等。

.git/objects:该目录包括所有的对象,包括提交对象,树对象,数据对象。对象的sha1值有40位,前两位作为文件夹名,后38位作为文件名。

.git/refs:该目录包含每个本地分支heads下,每个本地标签tags下,远程仓库信息remotes下(包括所有远程分支及tag)。

config文件:仓库的配置信息

index文件:暂存区的状态,通过该文件,可以生成树对象。

HEAD文件:当前分支信息

2、对象模型:

每个对象(object) 包括三个部分:类型,大小和内容。大小就是指内容的大小,内容取决于对象的类型,有四种类型的对象:"blob"、"tree"、 "commit" 和"tag"。

blob:仅仅表示数据内容,只要内容一致blob就一致,和其关联的目录结构没有任何关系。

tree:表示内容之间的目录层次关系,包含一系列条目,可以包括其他tree、blob。

commit:表示一次提交描述,只指向一个tree,用来标记项目某一个特定时间点的状态,包括tree、parent、作者、提交者、注释。

tag:表示对某个提交做标记,包括object(关联commit的SHA1签名), 对象类型, 标签创建人的名字("tagger"), 还有一条可能包含有签名(signature)的消息

3、内部组织:

Git内部通过一定逻辑规则,将上面的四个简单对象组织在一起形成一套文件系统,底层仍旧使用操作系统的文件系统。

其中:

blob:是最小的逻辑单元

tree:由一些其他tree和blob组成,类似操作系统的目录(tree)和文件(blob)

commit:指向一个tree

tag:指向一个commit,是对某个commit的固定标记

4、文件状态:

Git有四种文件状态,分别是未跟踪(Untracked)、未修改(Unmodify)、已修改(Modified)、暂存状态(Staged)。

Untracked: 未跟踪, 此文件在工作区中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

Unmodify: 未修改,文件已经入版本库, 但未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

Modified: 已修改,文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存区成为暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改

Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致,文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

5、工作流

Git工作流分为下面几种形式:

5.1、集中式工作流

和SVN一样,该形式有一个中央仓库,所有的修改都提交到了Master分支上,这种方式与SVN的主要区别就是开发人员有本地库。Git很多特性并没有用到。

5.2、GitFlow工作流

按Git推荐标准预设一些分支,主要包括:

主干分支master、开发分支develop、修复分支hotfix、预发布分支release、功能分支feature

实际应用可根据需要设计不同的分支,让发布迭代过程更符合实际需要。

5.3、Forking工作流

在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。

6、通信协议

Git支持下面一些通信协议,具体有HTTP、HTTPS、SSH、GIT

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索开源:获取完整的 GitHub 社区数据集

本篇文章聊聊 GitHub 开放数据集的获取和整理,分享一些数据整理的细节技巧,以及一些相对粗浅的数据背后的事情。 写在前面 分析 GitHub 上的项目和开发者获取是深入、真实的了解开源世界演进的方法之一。 在 GHArchive 项目中,我们能够看到…

什么是知识库,内部知识库和外部知识库各有什么优势?

知识库的定义在互联网的整个历史中多次发生变化。起初,它是一个术语,用于描述比通用关系“数据库”更先进的任何复杂数据存储系统。现在,随着SaaS的出现,知识库一词的含义更加不同。根据定义,知识库是一个自助服务存储…

Java多线程(二)--线程相关内容

1.创建线程的几种方式继承 Thread 类;public class MyThread extends Thread { Override public void run() {System.out.println(Thread.currentThread().getName() " run()方法正在执行..."); }实现 Runnable 接口;public class MyRunnable…

Vue使用ECharts

Vue简介 Vue文档 vue是一款用于构建用户界面的JavaScript框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 ECharts简介 快…

Elasticsearch7.8.0版本进阶——近实时搜索

目录一、近实时搜索的概述1.1、按段(per-segment)搜索1.2、更轻量的方式搜索二、为什么Elasticsearch是 近 实时搜索三、如何解决索引了一个文档然后却没有搜到四、哪种情况不需要每秒刷新4.1、使用 Elasticsearch 索引大量的日志文件4.2、使用 Elastics…

说一下this,实现apply、call

理解this 在ES5中,this的指向始终坚持一个原理:“this永远指向最后调用它的那个对象”,切记这句话。下面看几个例子。 例一 var obj {name: zhangsan,say: function() {console.log(this.name);} }obj.say() // zhangsan 最基本的使用&am…

突破年薪百万难关!吃透这套Java真题合集

前言我相信大多 Java 开发的程序员或多或少经历过BAT一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#x…

【软考——系统架构师】架构、系分、软设的区别和联系

🔎这里是【软考——系统架构师】,关注我考试轻松过线 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 文章目录👀三科相同点👀三科不同点--上午题&am…

【Classical Network】EfficientNetV2

原文地址 原文代码 pytorch实现1 pytorch实现2 详细讲解 文章目录EfficientNet中存在的问题NAS 搜索EfficientNetV2 网络结构codeEfficientNet中存在的问题 训练图像尺寸大时,训练速度非常慢。train size 512, batch 24时,V100 out of memory在网络浅…

联想笔记本无法下载 Lenovo Vantage

状况 在 Microsoft Store 下载时发生错误,可能是如下代码:0x80070005, 0x80073D05, or 0x80070017. 解决方法 1.在“开始”菜单搜索栏中输入PowerShell 2.当Windows PowerShell出现在“开始”菜单中,右键点击此图标,然后选择以…

AWS攻略——使用中转网关(Transit Gateway)连接同区域(Region)VPC

文章目录环境准备创建VPC配置中转网关给每个VPC创建Transit Gateway专属挂载子网创建中转网关创建中转网关挂载修改VPC的路由验证创建业务Private子网创建可被外网访问的环境测试子网连通性Public子网到Private子网Private子网到Private子网知识点参考资料在《AWS攻略——Peeri…

I.MX6ULL_Linux_系统篇(18) uboot移植

原厂uboot 编译 uboot 的移植并不是说我们完完全全的从零开始将 uboot 移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的, 半导体厂商负责将 uboot 移植到他们的芯片上,因此半导体…

网易云音乐财报解读:收入大增亏损收窄,“云村”草长莺飞

独家版权时代结束后,在线音乐产业进入了新的发展阶段,各家音乐平台经营状况备受关注。 2月23日,网易云音乐公布了2022年全年财务业绩。财报显示,网易云音乐2022年全年收入为90亿元,较2021年同比增长28.5%。 值得一提的…

IDEA集成Git

1:IDEA集合Git1.1:配置Git忽略文件-IDEA特定文件问题 1:为什么要忽略他们?答: 与项目的实际功能无关, 不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。问题 2:怎么忽略?1&a…

分布式锁zookeeper实现详解原理及落地方案

吐血推荐:最近整理之前面试BAT的材料,写了一份《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 领取方法: Java面试BATJ通关手册 介绍 当一个应用程序需要在分布式系统中对共…

cmake demo

工程描述 1,为工程添加一个子目录src,用来存储源代码; 2,添加一个子目录doc,用来存储这个工程的文档hello.txt 3,在工程目录添加文本文件COPYRIGHT, README; 4,在工程目录添加一个runhello.sh …

18_FreeRTOS任务通知

目录 任务通知的简介 任务通知值的更新方式 任务通知的优势 任务通知的劣势 任务通知值和通知状态 发送通知相关API函数 接收通知相关API函数 任务通知模拟信号量实验 任务通知模拟消息邮箱实验 任务通知模拟事件标志组实验 任务通知的简介 任务通知:用来通知任务的…

JVM 学习(1)—JVM 与 JMM 内存模型简单理解

一、JVM 内存模型概述 (1) 为什么会出现 JVM 内存模型呢? JVM 内存模型是为规范描述 Java 虚拟机在执行 Java 程序时,将程序中的数据和代码存储到计算机内存中的方式和规则。JVM 内存模型定义 Java 虚拟机所使用的内存结构以及内存区域之间的关系&…

数据归档,存储的完美储备军

数据爆炸性增长的同时,存储成为了大家首要担心的问题大家都希望自家数据保存20年、50年后仍完好无损但是,N年后的数据量已达到一个无法预测的峰值如此大量的数据在保存时极可能存在丢失、损坏等问题这时需要提前对数据进行“备份”、“归档”备份是对数据…

Linux->进程概念于基本创建

1. 进程基本概念 当一个可执行程序被加载到内存当中,并由操作系统将其管理起来,此时这个程序就被称之为进程。也就是下方的: 程序的一个执行实例,正在执行的程序等 担当分配系统资源(CPU时间,内存&#xff…