【QA】Git的底层原理

news/2024/5/20 2:15:05

前言

本文通过一个简单的示例,来理解Git的底层原理。

示例

1、新建本地仓库并上传第一个文件

相关步骤

  • 新建仓库及创建文件
  • 查看文件状态
  • 将文件添加到暂存区
  • 将文件提交到本地仓库
HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1
$ git init  	# 初始化一个空的仓库
Initialized empty Git repository in D:/GSF_Data/Github/Java/Git/git-test-1/.git/HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git status	# 查看当前状态
On branch masterNo commits yetnothing to commit (create/copy files and use "git add" to track)HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ touch a.txt	# 创建文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ vi a.txt		# 编辑文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ cat a.txt		# 查看文件内容
创建a.txt,并提交到本地仓库HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git status	# 查看当前状态,工作区有文件更改,但是没有添加到暂存区
On branch masterNo commits yetUntracked files:(use "git add <file>..." to include in what will be committed)a.txtnothing added to commit but untracked files present (use "git add" to track)HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git add .		# 将文件添加到暂存区,警告可以不用管
warning: in the working copy of 'a.txt', LF will be replaced by CRLF the next time Git touches itHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$git status		# 查看当前状态,追踪到文件在暂存区,但是还没有提交到本地仓库
On branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file:   a.txtHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git commit -m "创建a.txt文件" .		# 将所有文件提交到本地仓库,并添加注释
warning: in the working copy of 'a.txt', LF will be replaced by CRLF the next time Git touches it
[master (root-commit) 30d0542] 创建a.txt文件1 file changed, 1 insertion(+)create mode 100644 a.txtHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git status		# 查看当前状态
On branch master
nothing to commit, working tree cleanHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ 

概念介绍 | 版本号

版本号组成

  • 常规的版本号可能是:v1、v2…v10。
  • Git的版本号通过SHA-1算法,生成40位的十六进制数字。40位数字中,分成2+38:前两位用来定位文件夹,后38位用来定位文件。

Git为什么要这样选择版本号

  • 因为Git是一个分布式的版本控制软件,通过这样算法生成的版本号,可以大概率避免文件重复。

Git命令查询版本号

HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git log	# 查看历史记录
commit 30d0542a85b3f3248e5a363b491978251e631978 (HEAD -> master)	# 版本号(从HEAD指向主分支master)
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 17:52:28 2024 +0800创建a.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ 

查看文件在本地仓库中的位置:.git/objects

image-20240104180845595

查看版本号对应的文件内容

常规编辑器无法查看,需要使用Git命令查看文件内容

相关Git命令

HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git log
commit 30d0542a85b3f3248e5a363b491978251e631978 (HEAD -> master)	# 第一次提交的版本号
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 17:52:28 2024 +0800创建a.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 30d0542a85b3f3248e5a363b491978251e631978		# 查看第一次提交的版本号的内容
tree 30ed07b83fcd3a42970483553d54f44481630250			# 是一个状态信息,对应一个新的版本号
author hmteen <sfguo1@126.com> 1704361948 +0800
committer hmteen <sfguo1@126.com> 1704361948 +0800创建a.txt文件		# commit时候的信息HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 30ed07b83fcd3a42970483553d54f44481630250		# 查看状态信息
100644 blob 04b3abdeac873dcf8d7d9fafe35ecaac711abe45    a.txt	# 普通文件 blob对象 文件内容对应的版本号 文件名字HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 04b3abdeac873dcf8d7d9fafe35ecaac711abe45		# 查看文件内容
创建a.txt,并提交到本地仓库HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$

总结:

  • 可以看到Git在提交一个文件到本地仓库后,创建了三个版本号:提交信息的版本号、文件状态的版本号、文件内容的版本号

  • 三个版本号有明显的单向传递特点

2、依次对一个文件完成新增、修改、删除操作

在初次提交a.txt文件到本地仓库后,依次进行b.txt文件的:增、改、删操作,然后追溯版本号,理解Git的版本控制原理

HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ vi b.txt		# 创建并编辑b.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ cat b.txt		# 查看b.txt文件内容
新增b.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git add .		# 文件送到暂存区
warning: in the working copy of 'b.txt', LF will be replaced by CRLF the next time Git touches itHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git commit -m "新增b.txt文件" .		# 文件送到本地仓库
warning: in the working copy of 'b.txt', LF will be replaced by CRLF the next time Git touches it
[master 7952e76] 新增b.txt文件1 file changed, 1 insertion(+)create mode 100644 b.txtHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git log		# 查询历史日志信息
commit 7952e76b009d616902d9e804d3f17c29580ed967 (HEAD -> master)
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 18:57:32 2024 +0800新增b.txt文件commit 30d0542a85b3f3248e5a363b491978251e631978
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 17:52:28 2024 +0800创建a.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 7952e76b009d616902d9e804d3f17c29580ed967		# 查询最后一次提交的内容
tree 54996d3d5053ca3730310752ed0b7779e87df134					# 最后一次提交指向的状态信息的版本号
parent 30d0542a85b3f3248e5a363b491978251e631978					# 其父版本号,即提交a.txt对应的版本号
author hmteen <sfguo1@126.com> 1704365852 +0800
committer hmteen <sfguo1@126.com> 1704365852 +0800新增b.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 54996d3d5053ca3730310752ed0b7779e87df134		# 最后一次提交的状态内容,包含前一次提交的文件和最新提交的文件
100644 blob 04b3abdeac873dcf8d7d9fafe35ecaac711abe45    a.txt	# 对比上一次提交,版本号不变
100644 blob 3f6facf24a61f2aeba635f4220bf5b66b6896921    b.txt	# 新建的文件,拥有一个版本号HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 3f6facf24a61f2aeba635f4220bf5b66b6896921		# 查看文件内容
新增b.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 04b3abdeac873dcf8d7d9fafe35ecaac711abe45		# 查看文件内容
创建a.txt,并提交到本地仓库HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ vi b.txt		# 编辑修改文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git add .		
warning: in the working copy of 'b.txt', LF will be replaced by CRLF the next time Git touches itHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git commit -m "修改b.txt文件" .
warning: in the working copy of 'b.txt', LF will be replaced by CRLF the next time Git touches it
[master 0fb383a] 修改b.txt文件1 file changed, 1 insertion(+)HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git log
commit 0fb383ae5f814aa3d8a5af44f7371a048a96b6a6 (HEAD -> master)
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 19:01:09 2024 +0800修改b.txt文件commit 7952e76b009d616902d9e804d3f17c29580ed967
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 18:57:32 2024 +0800新增b.txt文件commit 30d0542a85b3f3248e5a363b491978251e631978
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 17:52:28 2024 +0800创建a.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 0fb383ae5f814aa3d8a5af44f7371a048a96b6a6		# 查看最新一次提交
tree ad1dc728a75b0b9cd6f4113e0dc0d9b0a2125c1f					# 最新一次提交对应的文件状态信息
parent 7952e76b009d616902d9e804d3f17c29580ed967					# 父版本,倒数第二次提交的版本号
author hmteen <sfguo1@126.com> 1704366069 +0800
committer hmteen <sfguo1@126.com> 1704366069 +0800修改b.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p ad1dc728a75b0b9cd6f4113e0dc0d9b0a2125c1f
100644 blob 04b3abdeac873dcf8d7d9fafe35ecaac711abe45    a.txt	# 未作修改,版本号不变
100644 blob 647f137f6e509673f5681ed2f6a4cfda7cb075c5    b.txt	# 对比新建该文件时候的版本号,版本号已经改变了,说明是一个新的文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 647f137f6e509673f5681ed2f6a4cfda7cb075c5
新增b.txt文件
修改b.txt问价HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 04b3abdeac873dcf8d7d9fafe35ecaac711abe45
创建a.txt,并提交到本地仓库HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ rm b.txt		# 删除文件内容HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git add .HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git commit -m "删除b.txt文件" .
[master d512d7f] 删除b.txt文件1 file changed, 2 deletions(-)delete mode 100644 b.txtHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git log
commit d512d7f86477af65af85710770ee252b713f04cc (HEAD -> master)
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 19:04:47 2024 +0800删除b.txt文件commit 0fb383ae5f814aa3d8a5af44f7371a048a96b6a6
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 19:01:09 2024 +0800修改b.txt文件commit 7952e76b009d616902d9e804d3f17c29580ed967
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 18:57:32 2024 +0800新增b.txt文件commit 30d0542a85b3f3248e5a363b491978251e631978
Author: hmteen <sfguo1@126.com>
Date:   Thu Jan 4 17:52:28 2024 +0800创建a.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p d512d7f86477af65af85710770ee252b713f04cc
tree 30ed07b83fcd3a42970483553d54f44481630250
parent 0fb383ae5f814aa3d8a5af44f7371a048a96b6a6
author hmteen <sfguo1@126.com> 1704366287 +0800
committer hmteen <sfguo1@126.com> 1704366287 +0800删除b.txt文件HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 30ed07b83fcd3a42970483553d54f44481630250		# b.txt文件已删除,只剩下a.txt文件
100644 blob 04b3abdeac873dcf8d7d9fafe35ecaac711abe45    a.txtHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 04b3abdeac873dcf8d7d9fafe35ecaac711abe45
创建a.txt,并提交到本地仓库HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git cat-file -p 647f137f6e509673f5681ed2f6a4cfda7cb075c5		# 查询修改b.txt文件时的版本号,依旧可以看到文件内容,证明只是删除了引用,文件的内容并没有被删除
新增b.txt文件
修改b.txt问价HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$

Git底层原理图示!!!

image-20240104195151194

第一次:创建a.txt

  • 仅有1个log信息,一个提交版本号,一个状态版本号,一个文件版本号

第二次:创建b.txt

  • 有2个log信息,新增一个提交版本号,新增一个状态版本号(指向上一个父版本),新增一个文件版本号

第三次:修改b.txt

  • 有3个log信息,新增一个提交版本号,新增一个状态版本号(指向上一个父版本),新增一个文件版本号

第四次:删除b.txt

  • 有4个log信息,新增一个提交版本号,新增一个状态版本号(指向上一个父版本),没有新增文件版本号

3、新建一个user分支

HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git branch user		# 新建user分支

怎么查看数据最新版本?

疑问:如果创建了多个不同的分支,每个分支下又有不同的提交版本,该怎么确定使用的是哪个分支?怎么确定使用的是哪个版本?

答案:查看.git目录下的HEAD文件

image-20240104195857603

HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ cat .git/HEAD		# HEAD内容:给出了当前使用的是哪个版本
ref: refs/heads/masterHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (user)
$ cat .git/refs/heads/master	# master内容:记录了最新的版本号信息
d512d7f86477af65af85710770ee252b713f04cc

不同分支下查看数据的最新版本

HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ cat .git/HEAD
ref: refs/heads/masterHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (user)
$ cat .git/refs/heads/master
d512d7f86477af65af85710770ee252b713f04ccHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (master)
$ git checkout user
Switched to branch 'user'HMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (user)
$ cat .git/HEAD
ref: refs/heads/userHMTeen@LAPTOP-46U4TV6K MINGW64 /d/GSF_Data/Github/Java/Git/git-test-1 (user)
$ cat .git/refs/heads/user
d512d7f86477af65af85710770ee252b713f04cc

可以看到:新增分支后,仅HEAD文件指向的路径发生了变化,指向了一个新增的文件(以新增的分支名字命名的文件),文件内容是最新一次修改的版本号

  • 说明1:新增分支并没有复制已有文件内容,而仅仅是新增了一个地址指向
  • 说明2:新增的分支user,是以master主分支为基础的,指向了master分支最新更改的内容

总结

  • .git文件夹里面的内容就是本地仓库;其同目录下的其他文件及文件夹是工作区;远程仓库是第三方代码托管平台,比如:GitHub、Gitee
  • 文件的新增、修改都会创建一个新的文件;文件的删除不会创建新的文件
  • .git文件夹下的内容总空间 > 工作区文件、文件夹占用空间

http://www.mrgr.cn/p/60454222

相关文章

职场口才使人取得事业上的成功?

职场口才使人取得事业上的成功&#xff1f; 一、引言 在职场中&#xff0c;一个人的口才能力往往成为其事业成功的关键因素。优秀的职场口才不仅能够帮助我们更好地与他人沟通交流&#xff0c;还能够展现个人的专业素养和魅力&#xff0c;为事业的顺利发展奠定坚实基础。本文将…

力扣-419. 甲板上的战舰

1.题目 题目地址(419. 甲板上的战舰 - 力扣(LeetCode)) https://leetcode.cn/problems/battleships-in-a-board/ 题目描述 给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 X 或者是一个空位 . ,返回在甲板 board 上放置的 战舰 的数量。 战舰…

有没有大佬知道这种数据应该怎么抓取呀?

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【王者级混子】问了一个Python网络爬虫的问题。问题如下:有没有大佬知道这种数据应该怎么抓取呀?我鼠标移到上面才会出现的数据。二、实现过程 这里【Crazy】和【此类生物】给了一个指导。后来粉丝也查了下谷歌…

你的网站还在使用HTTP? 免费升级至HTTPS吧

如果您的网站还在使用老的http协议&#xff0c;可以申请一个免费的SSL证书升级至https&#xff01; 具体步骤如下&#xff1a; 1 申请免费SSL证书 根据你的需求选择合适的SSL证书类型&#xff0c;如单域名证书&#xff0c;多域名证书、通配符证书 登录免费供应商JoySSL官网&…

有意思!一个关于 Spring 历史的在线小游戏

发现 Spring One 的官网上有个好玩的彩蛋,分享给大家! 进到Spring One的官网,可以看到右下角有个类似马里奥游戏中的金币图标。点击该金币之后,会打开一个新的页面,进入下面这样一个名为:The History Of Spring 的在线小游戏你可以使用上下左右的方向键来控制Spring的Log…

店匠科技技术产品闪耀,引领新质生产力发展

在科技飞速发展的今天,新质生产力正成为推动社会进步和经济高质量发展的核心力量。店匠科技,作为一家致力于为全球B2C电商提供产品和技术解决方案的领先企业,其技术产品不仅体现了新质生产力的创新特质,更在推动电商行业转型升级中发挥了重要作用。 新质生产力,以创新为主导,摆…

原型链prototype、__proto、constructor的那些问题整理

再了解原型链之前,我们先来看看构造函数和实例对象的打印结构 - 函数 这里我们定义一个构造函数Fn,然后打印它的结构吧 function Fn(){} console.dir(Fn)控制台得到结构 从上面结构我们能看的出来,函数有两种原型,一种是作为函数特有的原型:prototype,另一种是作为对象的__…

【Linux】进程间通信(共享内存、消息队列、信号量)

一、System V —— 共享内存&#xff08;详解&#xff09; 共享内存区是最快的 IPC 形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说&#xff0c;就是进程不再通过执行进入内核的系统调用来传递彼此的数…

3d合并的模型为什么没有模型---模大狮模型网

在3D建模中&#xff0c;合并模型是常见的操作&#xff0c;它可以将多个模型合并成一个整体。然而&#xff0c;有时候在合并后却发现部分模型消失了&#xff0c;这可能会让人感到困惑和失望。本文将探讨为什么合并的3D模型中会出现没有模型的情况&#xff0c;并提供一些解决方法…

React 《useEffect》

概念 useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用), 比 如发送AJAX请求,更改DOM等等:::warning 说明:上面的组件中没有发生任何的用户事件,组件渲染完毕之后就需要和服务器要数据,整个过程属于“只由渲染引起的…

SVN小乌龟汉化问题

1.首先确认中文语言包和SVN版本需要一致&#xff08;点击右键 选择最后一个选项即可查看&#xff09; 官网链接 点击这个官网链接可以下载对应版本的中文包 2.下载好之后直接无脑下一步安装即可 3.如果还是没有中文&#xff0c;找到这个文件夹&#xff0c;把里面的内容全部删…

Nessus 10.7 Auto Installer for Ubuntu 22.04 (updated Apr 2024)

Nessus 10.7 Auto Installer for Ubuntu 22.04 (updated Apr 2024)Nessus 10.7 Auto Installer for Ubuntu 22.04 (updated Apr 2024) 发布 Nessus 试用版自动化安装程序,支持 macOS Sonoma、RHEL 9 和 Ubuntu 22.04 请访问原文链接:https://sysin.org/blog/nessus-auto-inst…

好久没关注uCOS系统的消息了,全家桶免费后,竟一直以全新的名字Flexible Safety RTOS登场,且一直在更新

【视频版】 https://www.bilibili.com/video/BV1Kb421Y7v9【前言】 2020年初,uCOS全家桶宣布免费后,其Github上uCOS-III更新过两个小版本,uCOS-II仅更新了一次,后面就一直没有更新。 uCOS-II的最后一次更新定格在2021年:uCOS-III的最后一次更新定格在2022年末 【现状】 开…

Proxmox VE 8.2 引入 VMware 导入向导、增强的备份选项和高级 GUI 功能

Proxmox VE 8.2 引入 VMware 导入向导、增强的备份选项和高级 GUI 功能Proxmox VE 8.2 引入 VMware 导入向导、增强的备份选项和高级 GUI 功能 Proxmox VE 8.2 发布 - 开源虚拟化管理平台 请访问原文链接:https://sysin.org/blog/proxmox-ve-8/,查看最新版。原创作品,转载请…

光伏无人机:巡检无人机解决巡检难题

随着科技的飞速发展&#xff0c;无人机技术已经广泛应用于各个领域&#xff0c;其中光伏无人机在解决光伏电站巡检难题方面发挥了重要作用。光伏无人机以其高效、精准、安全的特点&#xff0c;为光伏电站的巡检工作带来了革命性的变革。 光伏电站通常位于广阔的户外场地&#x…

局部多项式近似与 AMPM 算法

kappa3; %已在您的代码中定义% 定义窗口大小 windowSize (2*kappa1);% 初始化梯度估计值 [rows, cols] size(wrappedPhase); phi_y zeros(rows, cols); phi_x zeros(rows, cols);% 遍历每个窗口 for m 1kappa:rows-kappafor n 1kappa:cols-kappa% 提取局部窗口Z_mn wrap…

go设计模式之抽象工厂模式

抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 工厂方法模式通过引入工厂等级结构&#xff0c;解决了简单工厂模式中工厂类职责太重的问题&#xff0c;但由于工厂方法模式中的每个工厂只生产一类产品&#xff0c;可能会导致…

DS进阶:AVL树和红黑树

一、AVL树 1.1 AVL树的概念 二叉搜索树&#xff08;BST&#xff09;虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-…

WDS+MDT网络启动自动部署windows(十)硬盘分区格式化全自动

简介: 虽然WDS+MDT在单硬盘很方便,但是各种大硬盘,小固态加大硬盘的地方,还是有若干不便之处。 如:第二块硬盘未分区格式化,需要手动选择安装磁盘,如果固态超过250G,是否需要分为两个区? 自动选择较小的硬盘 目前我这里的终端都是小固态,大机械,那么我们要尝试一下自…