Git核心原理

Git 的原理 文章目录什么是 Git?版本库是由什么构成的版本库(项目文件夹)的构成版本库(对象数据库)的结构提交的组成SHA1 算法总结暂存区什么样的文件,不应该上传到版本库中?查看暂存区清空暂存区选择性提交版本库管理版本的回滚、复原分支为什么有分支的存在?分支管理:创建、合并、变基创建与删除分支合并分支变基标签(tags)创建标签标签的管理与作用版本库的交互创建克隆版本库裸版本库版本库之间的版本分享抓取 Fetch 操作Pull = Fetch + MergePushGithub思考题 什么是 Git? Git 是一 阅读详情

Git核心原理

1 Git简介

什么是Git?首先来一段官方介绍:

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

看来要了解什么是Git,首先我们要了解什么是版本控制了。

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

由于现代软件开发项目具有周期长,参与人员多的特点,版本控制便成了现代软件开发过程中必不可缺的一部分。通过版本控制我们可以轻松实现:

  • 优雅备份
  • 多人协作

1.1 版本控制系统

1.1.1 集中式版本控制系统

在一个单一的服务器中保存所有文件的修订版本,协同工作的人们通过客户端连接到服务器,获取最新的文件或者提交更新。

  • 单点故障
  • 数据丢失

如图所示,完整的版本信息保存在中央服务器中,而每个客户端所保存的只是某个版本的内容。

集中式版本控制系统

1.1.2 分布式版本控制系统

每一个客户端保存完整的代码仓库镜像。如果服务器发生了故障,就可以用本地仓库的镜像恢复。每一次克隆操作其实是对整个版本库的完整备份。
如图所示,每一个客户端中都保存有版本信息。
分布式版本控制系统

1.2 Git的特点

Git 特点:1.记录快照而非比较差异;2.几乎所有操作都是本地执行;3.保证完整性;4.一般只添加数据

  • 记录快照而非比较差异
    以文件变更列表的形式存储信息:保存一组基本文件和每个文件积累的差异,当需要查看某个版本的数据时,通过计算得出完整的文件内容。
    以文件变更列表的形式保存信息

以快照流的方式存储信息:把数据当作是对小型文件系统的一组快照,每个版本都保存完整的文件信息。为了提高效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
快照流

  • 几乎所有操作都是本地执行
    可以在没有网络的情况下查看版本信息,提交版本信息,只不过在多人协作的场景下,不一定能同步最新的版本信息。
  • 保证完整性
    在存储数据的时候,Git会使用SHA-1散列机制根据文件内容或者目录结构计算出校验和,并以校验合引用。如果在传送过程中信息发生丢失或者改变,Git就能发现。
  • 一般只添加数据
    几乎所有的Git操作都是在往Git数据库中添加信息。一旦将数据推送到Git仓库,就很难再丢失数据。即使是“回退”等操作,也不是将不要的commit删除,所有的commit信息仍然保存在数据库中。

2 Git 核心原理

2.1 Git区域

Git 大致可以划分为三个工作区域:Git仓库、工作目录、暂存区。Git管理的文件会处于三种状态之一:已提交(committed)、已修改(modified)和已暂存(staged)。

三种状态:已提交(committed)、已修改(modified)和已暂存(staged)
1.已提交:数据已保存在数据库中。
2.已暂存:对已修改文件的当前版本做了标记,使之包含在下一次提交的快照中。
3.已修改:文件已被修改,但是尚未保存到数据库中。
三个区域:Git 仓库、工作目录以及暂存区域
Git仓库:Git 用来保存项目的元数据和对象数据库的地方。
工作目录:对项目的某个版本独立提取出来的内容。
暂存区:一个保存了下次将提交的文件列表信息的文件。
状态转换

git status 显示工作目录和暂存区的状态

下面为新建三个文件a.txt,b.txt,c.txt后add b.txt,c.txt,随后修改c.txt后执行git status得到的结果

git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#        new file:   b.txt
#        new file:   c.txt
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#        modified:   c.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#        a.txt

其实更为准确地说该命令是展示文件在三个工作区域中的差异。仅在工作目录中,不在暂存区的文件状态为Untracked files,表示未被Git跟踪;在工作区和暂存区中都存在但是内容不同为Changes not staged for commit,在工作区和暂存区中都相同但是不在数据库中则为Changes to be committed,表示待提交。我们可以根据Git的提示,使用不同的命令撤回操作,如git checkout -- <file>,撤销工作区中的修改,将其恢复到暂存区中的版本。

2.2 Git 目录

当我们在一个目录中执行git init,Git会创建一个.git目录,几乎所有的Git对象都会存储在这个目录中,我们后续也会沿着目录中的内容展开讲解。

以下是在一个空目录中执行git init后生成的.git文件夹中的内容。

[root@vm-20-8-centos git-demo]# git init
Initialized empty Git repository in /usr/local/git-demo/.git/
[root@vm-20-8-centos git-demo]# tree .git
.git
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   `-- update.sample
|-- info
|   `-- exclude
|-- objects
|   |-- info
|   `-- pack
`-- refs
    |-- heads
    `-- tags

下面对主要目录进行介绍:

  • hooks:Git钩子脚本。在特定的重要动作发生时触发自定义脚本。有两组钩子:客户端的和服务器端的。客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
  • info
    • exclude:全局性排除文件,放置不希望被记录在.gitignore文件中的忽略模式 。.gitignore配置文件会提交到仓库,所以常用于对公共文件的控制。exclude文件的修改不会被提交到仓库。
  • objects:存储所有的数据内容,此文件夹中的内容大多是不可变的 。里面存放着三种git object。
  • refs:存放一系列引用。包括heads 本地分支,remote 远程分支,tags 标签。
  • config:项目配置文件。Git一共有三个级别的配置,分别是 --system系统级, --global用户级和仓库级。git config -l
  • HEAD:当前检出的分支
  • index:暂存区信息。使用git ls-files --stage 查看该文件内容
  • description:⽤于GitWeb程序,显示对仓库的描述。

git help gitrepository-layout 查看官方目录说明

对于目录的官方介绍

2.3 Git Object

我们先来看一下objects文件夹中的内容。

[root@vm-20-8-centos git-demo]# tree .git/objects
.git/objects
|-- 08
|   `-- fe7365fb4dc9e21ea09747e2b81d6470895dd5
|-- 0c
|   `-- ca7e1d6fb5a88ccbf8430fa2ba841edcf70ec6
|-- 37
|   `-- 057b2e8a9041ef88b805a5b7c4e0e668a03be4
|-- 72
|   `-- 943a16fb2c8f38f9dde202b7a70ccc19c52f34
|-- cc
|   `-- c3e7b48da0932cc0f7c4ce7b4fd834c7032fe1
|-- ee
|   `-- da65ae8f26bbc7beb16283653afcd5f29a190b
|-- info
`-- pack

.git/objects/目录下存放着三种Git object,分别是数据对象(blob),树对象(tree objec),提交对象(commit object)。
数据对象(blob):内容无固定格式,比较简单。存放数据内容。
树对象(tree object):树对象描述了工作区的内容。存储的信息包括指向数据对象或者子树对象的指针,以及相应的模式、类型、文件名信息。
提交对象(commit object):在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。

git cat-file

-p 查看object内容
-t 查看对象类型

Blob

[root@vm-20-8-centos git-demo]# git cat-file -p 7294
aaa

可以看到blob的内容就是文件的内容。
Tree

[root@vm-20-8-centos git-demo]# git cat-file -p 31fd
100644 blob ccc3e7b48da0932cc0f7c4ce7b4fd834c7032fe1        a.txt
040000 tree b937120dc3951277017602a630e50b0a271f6182        next
[root@vm-20-8-centos git-demo]# git cat-file -p b937
100644 blob f761ec192d9f0dca3329044b96ebdb12839dbff6        b.txt

每一行从左到右依次是:文件模式、对象类型、对象的SHA-1指针、文件/目录名。
Git的文件模式参考了常见的 UNIX 文件模式:
100644:表明这是一个普通文件。(blob对象的文件模式一般都为100644)
100755:表示一个可执行文件。
120000:表示一个符号链接。
tree中的文件类型只会是blob或者tree。
Commit

[root@vm-20-8-centos git-demo]# git cat-file -p 08fe
tree 0cca7e1d6fb5a88ccbf8430fa2ba841edcf70ec6
parent eeda65ae8f26bbc7beb16283653afcd5f29a190b
author XianYu <1468399787@qq.com> 1666013606 +0800
committer XianYu <1468399787@qq.com> 1666013606 +0800

2.4 对象存储

文件名的生成:将头部信息和原始数据拼接起来,并计算出这条新内容的 SHA-1 校验和,得到一个长度为40个十六进制数组成的字符串。其中头部信息=对象类型(如blob)+空格+内容长度+空字节(null byte)。
SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
一旦数据内容发生改变,生成的SHA-1值就会发生改变。
随后Git将这条新内容通过Zlib压缩,并写入到磁盘中,以SHA-1的前两个字符为子目录名称,剩下的字符为文件名。

3 Git引用

在大多数时候我们并不想记住这一长串无规则的字符串,所以我们需要一个文件来保存 SHA-1 值,并给文件起一个简单 的名字,然后用这个名字指针来替代原始的 SHA-1 值。 这就是Git引用,它们被保存在.git/refs文件夹中。Git中的引用大致可以分为三种类型,分支、标签以及HEAD。

D:.
├─heads
│      feature_221012_ant
│      master
│
├─remotes
│  └─origin
│      │  feature_221008_refund
│      │  feature_221012_ant
│      │  HEAD
│      │  master
│      │
│      └─release
│              20220822-175752501755152_release_1644114_55
│              20220822-175820569111328_release_1644114_55
│
└─tags
        tag_2022-09-06-16-42-26
        tag_2022-09-22-19-52-53

3.1 分支

我们可以看到,refs目录中有两个文件夹,分别是heads和remote,它们存储着不同的类型的分支。

  • heads:本地分支
  • remote:远程分支
    我们可以查看一下分支文件中的内容:
PS D:\IDEAPoject\unified-proxy-server\.git\refs> cat .\heads\feature_221012_ant
d8703d9b794305fe10c924853bab7c56d84f020b

这一串字符看上去有点眼熟是不是?我们可以查看一下提交记录。

git log 查看历史提交记录

PS D:\IDEAPoject\unified-proxy-server\.git\refs> git log --pretty=oneline feature_221012_ant -5
d8703d9b794305fe10c924853bab7c56d84f020b (HEAD -> feature_221012_ant, origin/feature_221012_ant) feat:升级api版本号
959ace250e57b7dd4a8a91427385fbab280fcf27 feat:****接口
1ab30f1f95bd2bf29fb73aadc236d75cb9ce66b1 ***进件
ec736f01d55d260afa7a1b8da02548824cdec74d feat:***接口
286552fcf9cf17a65efab13acc5c95e7c0b39a0c feat:***对接

我们发现,feature_221012_ant中存储的内容就是最新提交的commit id。通过cat-file查看该id的内容,便可以看到提交信息。

PS D:\IDEAPoject\unified-proxy-server\.git\refs> git cat-file -p d8703
tree cc4fa320f69ee511d9e2ba47103c9bc0771d3780
parent 959ace250e57b7dd4a8a91427385fbab280fcf27
author lu**wei <lu**wei@zj.tech> 1665995722 +0800
committer lu**wei <lu**wei@zj.tech> 1665995722 +0800

feat:升级api版本号

由上内容,我们不难得出Git 分支的本质:一个指向某一系列提交之首的指针或引用。由此不难理解,当我们使用git branch创建一个分支的时候,Git实际上是创建了一个指向当前提交对象的可移动的指针。
—— 创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此而已。
所以在 Git 中,任何规模的项目都能在瞬间创建新分支。 同时,由于每次提交都会记录父对象,所以寻找恰当的合并基础(即共同祖先)也是同样的简单和高效。
并且,当产生新的提交时,分支指针会自动移动,指向最新的提交对象。

3.2 HEAD

新的问题来了,当执行 git branch (branchname) 时,Git 如何知道最新提交的 SHA-1 值呢?答案是 HEAD 文件。HEAD 文件是一个符号引用(symbolic reference),指向目前所在的分支。所谓符号引用,意味着它并不像普通引用那样包含一个 SHA-1 值——它是一个指向其他引用的指针。
我们可以看一下HEAD文件的内容:

PS D:\IDEAPoject\unified-proxy-server\.git> cat HEAD
ref: refs/heads/feature_221012_ant

HEAD文件格式形如:ref:xxxx。可以看到,它保存着目前所在的分支的名称。
当执行git checkout 命令切换分支的时候,实际上是修改HEAD文件的内容;而当执行git commit的时候,会创建一个提交对象,并用 HEAD 文件中那个引用所指向的 SHA-1 值设置其父提交字段。

3.3 标签引用

前文我们刚讨论过 存放在objects文件夹下的三种主要对象类型,事实上还有第四种。标签对象(tag object)非常类似于一个提交对象——它包含一个标签创建者信息、一个日期、一段注释信息,以及一个指针。主要的区别在于,标签对象通常指向一个提交对象,而不是一个树对象。它像是一个永不移动的分支引用——永远指向同一个提交对象,只不过给这个提交对象加上一个更友好的名字罢了。
来看一下tag文件中的内容:

PS D:\IDEAPoject\unified-proxy-server\.git> cat .\refs\tags\tag_2022-08-15-22-47-55
b8839b545f83f33a67d82a99eb18deee33bc1304
我们得到了一串id,那么这一串id又是什么呢?
PS D:\IDEAPoject\unified-proxy-server\.git> git cat-file -t b8839
commit

可以看到,tag文件中的内容就是一个commit的指针。
标签又分为普通标签和附注标签。普通标签就是如上所展示的,它只是一个固定的引用。而附注标签除了指针之外,还包含了标签的说明信息。创建一个附注标签时,Git会创建一个标签对象,并记录一个引用来指向该标签对象,而不是直接指向提交对象。
可以通过git tag -a 创建一个附注标签:

[root@vm-20-8-centos git-demo]# git tag -a v1.1 50297f184aec540d9bd998857f2ac4b1164e9f34 -m 'first tag'

查看该tag的类型和内容:

[root@vm-20-8-centos git-demo]# git cat-file -t c6e031
tag
[root@vm-20-8-centos git-demo]# git cat-file -p c6e031
object 50297f184aec540d9bd998857f2ac4b1164e9f34
type commit
tag v1.1
tagger XianYu <1468399787@qq.com> 1666097176 +0800

first tag

4 底层命令

由于 Git 最初是一套面向版本控制系统的工具集,而不是一个完整的、用户友好的版本控制系统,所以它还包含了一部分用于完成底层工作的命令,称之为底层命令(plumbing)。我们日常使用到的例如checkout,add,commit,push这种命令我们称其为高层命令(porcelain)。当执行一个高层命令时,Git实际上是执行了一系列的底层命令。

4.1 git add

git add 将文件添加到暂存区

  1. 生成文件对应的blob object

git hash-object -w fileName
#该命令输出一个长度为40字符的校验和。是通过对头部信息和内容进行SHA-1校验运算得出的校验和。
#-w表示存储数据对象,若无次此参数,则该命令仅仅返回对应的键值。

[root@vm-20-8-centos git-demo]# echo 'aaa' > a.txt
[root@vm-20-8-centos git-demo]# git hash-object -w a.txt
72943a16fb2c8f38f9dde202b7a70ccc19c52f34
[root@vm-20-8-centos git-demo]# tree .git/objects/
.git/objects/
|-- 72
|   `-- 943a16fb2c8f38f9dde202b7a70ccc19c52f34
|-- info
`-- pack

3 directories, 1 file
[root@vm-20-8-centos git-demo]# git cat-file -p 7294
aaa

由于Git生成校验和时主要根据内容来生成,并且blob对象并不会记录文件名,所以如果内容相同而文件名不同的情况下,Git并不会重新生成数据对象。

[root@vm-20-8-centos git-demo]# echo 'aaa' > b.txt
[root@vm-20-8-centos git-demo]# echo 'aaa' > c.txt
[root@vm-20-8-centos git-demo]# git hash-object -w b.txt
72943a16fb2c8f38f9dde202b7a70ccc19c52f34
[root@vm-20-8-centos git-demo]# git hash-object -w c.txt
72943a16fb2c8f38f9dde202b7a70ccc19c52f34
[root@vm-20-8-centos git-demo]# tree .git/objects/
.git/objects/
|-- 72
|   `-- 943a16fb2c8f38f9dde202b7a70ccc19c52f34
|-- info
`-- pack

3 directories, 1 file
  1. 更新暂存区

git update-index --add --cacheinfo <mode> <object> <path>
#update-index 修改索引或目录缓存。
#–add 向暂存区中添加新文件
#–cacheinfo 直接将指定的信息插入索引。
将步骤1中新建的文件更新到暂存区:

[root@vm-20-8-centos git-demo]# git update-index --add --cacheinfo 100644 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 a.txt
[root@vm-20-8-centos git-demo]# git update-index --add --cacheinfo 100644 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 b.txt
[root@vm-20-8-centos git-demo]# git update-index --add --cacheinfo 100644 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 c.txt
[root@vm-20-8-centos git-demo]# git ls-files 
a.txt
b.txt
c.txt
[root@vm-20-8-centos git-demo]# git ls-files -s
100644 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 0        a.txt
100644 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 0        b.txt
100644 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 0        c.txt

4.2 git commit

  1. 根据暂存区内容生成tree对象
git write-tree
# 使用当前索引创建树对象。新树对象的名称被打印到标准输出。
[root@vm-20-8-centos git-demo]# git write-tree
0c58b56cf28846b55c20db49447e8836e62fe54b
[root@vm-20-8-centos git-demo]# git cat-file -t 0c58
tree
[root@vm-20-8-centos git-demo]# git cat-file -p 0c58
100644 blob 72943a16fb2c8f38f9dde202b7a70ccc19c52f34        a.txt
100644 blob 72943a16fb2c8f38f9dde202b7a70ccc19c52f34        b.txt
100644 blob 72943a16fb2c8f38f9dde202b7a70ccc19c52f34        c.txt
  1. 生成commit对象

git commit-tree <tree> [(-p <parent>)…] [(-m <message>)…]
#基于提供的树对象创建一个新的提交对象,输出生成的提交对象的id
#可指定 父提交对象 必须指定提交信息

[root@vm-20-8-centos git-demo]# git commit-tree 0c58 -m 'first commit'
f5a767fccb416e145dd5ef4fea6fcfea592fc45e
[root@vm-20-8-centos git-demo]# git cat-file -t f5a767
commit
[root@vm-20-8-centos git-demo]# git cat-file -p f5a767
tree 0c58b56cf28846b55c20db49447e8836e62fe54b
author XianYu <1468399787@qq.com> 1666100555 +0800
committer XianYu <1468399787@qq.com> 1666100555 +0800

first commit
  1. 更新分支使其指向最新的提交对象

git update-ref
更新引用

[root@vm-20-8-centos git-demo]# git update-ref refs/heads/master f5a767
[root@vm-20-8-centos git-demo]# cat .git/refs/heads/master
f5a767fccb416e145dd5ef4fea6fcfea592fc45e
[root@vm-20-8-centos git-demo]# git log master
commit f5a767fccb416e145dd5ef4fea6fcfea592fc45e
Author: XianYu <1468399787@qq.com>
Date:   Tue Oct 18 21:42:35 2022 +0800

    first commit

4.3 分支

  1. 创建分支
[root@vm-20-8-centos git-demo]# git update-ref refs/heads/test f5a767
[root@vm-20-8-centos git-demo]# ll .git/refs/heads/
total 8
-rw-r--r-- 1 root root 41 Oct 18 21:50 master
-rw-r--r-- 1 root root 41 Oct 18 22:02 test
  1. 切换分支

git symbolic-ref 读取,修改和删除符号引用
git symbolic-ref [-m <reason>] <name> <ref> 将<name>引用修改为<ref>
git symbolic-ref [-q] [--short] <name> 查看<name>符号引用内容
git symbolic-ref --delete [-q] <name> 删除<name>符号引用

[root@vm-20-8-centos git-demo]# git symbolic-ref HEAD refs/heads/test
[root@vm-20-8-centos git-demo]# cat .git/HEAD
ref: refs/heads/test
[root@vm-20-8-centos git-demo]# git branch
master
*test

参考资料:
Pro Git 2nd Edition:
https://git-scm.com/book/zh/v2
Git 中文参考:
https://apachecn.gitee.io/git-doc-zh/#/

Git核心原理与高效开发实践指南 版本控制系统是软件开发的基础设施,其中Git作为分布式架构的典范,通过对象模型(blob/tree/commit/tag)和有向无环图(DAG)实现高效的代码版本管理。理解Git的暂存区机制和分支原理,能够显著提升团队协作效率,特别是在持续集成(CI/CD)和代码审查场景中。本文从分布式版本控制的核心概念切入,解析Git如何通过SHA-1哈希和引用机制实现历史追溯,并演示rebase、交互式暂存等工程实践技巧,帮助开发者构建清晰的提交历史和高效的工作流。 阅读详情

相关推荐

bcftools学习笔记(一)

欢迎关注"生信修炼手册"!本篇主要介绍index, view, query, sort, reheader这五个命令。1. indexindex命令用于对VCF文件建立索...

庐州月光的博客 6012

git 原理简介

文章目录关于版本控制分为三种版本控制方案本地版本控制集中化的版本控制分布式版本控制 关于版本控制 什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 在本书所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。 作用: 如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能),采用版本控制系统(VCS)是个明智的选择。 有了它你就

安梓晨的博客 8068

Nvivo12新手避坑指南:从安装到编码的完整流程(附实战案例)

本文为Nvivo12新手提供了从软件安装、初始设置到数据导入和编码分析的完整避坑指南。通过一个“校园欺凌现象的学生访谈研究”实战案例,详细拆解了处理中文文本、创建项目结构、执行手动编码及高级查询等关键步骤,帮助研究者避开常见错误,快速上手并高效完成质性数据分析。

resnet7explorer的博客 317

Git 工作原理

Git 工作原理GIt简介Git 的基本原理Git的目录结构Git对象在之前我们提到过,Git是一套内容寻址(content-addressable)文件系统,那么Git是怎么进行寻址呢?Git对象的类型包括:==BLOB、tree对象、commit对象==。对象暂存区index文件创建树节点Commit对象提交树Commit Tree第二次提交第三次提交Git的常用命令Git logGit forkGit rebaseGit resetGit revertGit stash总结 GIt简介 Git和SVN

weixin_44684812的博客 3256

记录:MCGS和正弦变频器通讯

触摸屏实现对变频器:启动、停止、频率设定、频率读取、电压读取、电流读取。通讯方式Modbus RTU。

m0_61837027的博客 1026

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 353

Git基本原理及常用操作全集(超详细)

1)Git和SVN是我们最常用的版本控制系统(Version Control System, VCS)2)Git三大区域的划分(详见下文Git基本原理)工作区:能够看见的目录暂存区:也叫Index、Stage,通常存放在.git/index文件下版本库:分为本地版本库和远程版本库3)版本库状态几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着可以把我们的工作从开发主线上分离开来,以免影响开发主线分支是一个代码的副本;

Java/Python大数据随笔 1845

【Zotero】《纯操作讲解,GPT配置,Zotero标注可视化》- 知识点目录

Temperature分布在。之间,越低输出越稳定;

墨门 3396

转载:图解Git-思维导图不仅简单易懂还赏心悦目,让人不禁看了一遍又一遍。

图解Git 此页图解git中的最常用命令。如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻。 如果你想知道这个站点怎样产生,请前往GitHub repository。 正文 基本用法 约定 命令详解 Diff Commit Checkout Detached HEAD(匿名分支提交) Reset Merge Cherry Pick Rebase 技术说明 基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。 git

地球空间 944

告别复杂配置!用GuidosToolbox 3.0做MSPA景观格局分析,从安装到出图全记录

本文详细介绍了如何使用GuidosToolbox 3.0进行MSPA景观格局分析,从安装配置到出图全流程。涵盖环境准备、数据预处理、参数设置、结果解读及可视化技巧,帮助用户快速掌握这一生态安全评估工具。特别针对安装教程中的常见问题提供解决方案,提升分析效率。

weixin_29248313的博客 489

卫朋:IPD流程落地——产品计划阶段拆解

IPD计划阶段拆解

产品线负责人 957

GIT核心命令和底层原理。

文章目录一、GIT体系介绍1. 代码管理工具:SVN、CVS、GIT2. 存储方式3. 使用方式区别3. 版本管理模式区别底层原理 一、GIT体系介绍 1. 代码管理工具:SVN、CVS、GIT GIT和SVN有什么区别: 1. 存储方式不一样 2. 使用方式不一样 3. 管理模式不一样 2. 存储方式 GIT把内容按元数据方式存储类似k/v数据库,而SVN是按文件(新版svn已改...

Dcwjh的博客 907

31、双相不锈钢直齿轮加工与性能研究及人工神经网络在焊接中的应用

本文研究了双相不锈钢直齿轮在不同加工方法(WEDM与滚齿加工)下的磨损行为,分析了表面粗糙度、齿厚变化、磨损率及润滑性能随转速的变化规律,并对比了两种工艺的优劣。同时,探讨了人工神经网络(ANN)在AA7050铝合金搅拌摩擦焊中的应用,通过建立工艺参数与焊接质量之间的预测模型,实现了对焊缝硬度和峰值温度的准确预测。研究为高性能齿轮制造和铝合金焊接提供了理论支持和技术参考,并提出了未来在润滑优化、加工工艺改进及智能控制方面的研究方向。

ggg99的专栏 150

Git技术详解:从核心原理到实际应用

Git是由Linux之父Linus Torvalds在2005年开发的。

编程技术提升 1336

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Git 核心原理与实践

Git作为分布式版本控制系统,由Linus Torvalds开发,专为高效管理代码而生。其核心特性包括: 分布式架构:每个开发者拥有完整仓库副本,支持离线工作 高效存储:采用快照机制而非差异存储,支持海量分支(瞬间创建) 三阶段工作流:工作区→暂存区→仓库,通过git add/commit流转

Mr_-G,一名勤奋底层软件开发工程师的博客 1310

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Git 核心操作与原理全解析:从基础到实践

本文全面解析Git核心操作与原理,从环境配置到版本管理,系统讲解工作区、暂存区和版本库的三区交互逻辑。主要内容包括:Git安装与仓库初始化、文件增删改查全流程、版本回退(soft/mixed/hard模式)、.git目录结构解析等核心知识点。通过实操命令与原理图解,帮助开发者掌握代码版本管理精髓,解决日常开发中的版本控制难题。文章特别强调"工作区→暂存区→版本库"的流转逻辑,并提供常见问题解决方案,如误操作恢复等。适合作为Git入门到实践的完整指南,为后续学习分支管理和远程协作奠定基础。

2403_87581574的博客 2521

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Git教程:常用命令 和 核心原理

本文总结了Git的常用命令与核心原理。命令部分涵盖仓库操作、配置管理、文件操作、代码提交、分支管理、标签管理、信息查看、远程同步和撤销更改等场景。核心原理部分解释了Git的三个工作区域(工作区、暂存区、本地仓库)及其数据流转关系,重点说明了暂存区作为"购物车"的重要作用,以及git add、git commit等命令如何实现文件变更在区域间的转移。文章通过图示和简明解释,帮助理解Git版本控制的基本工作流程和底层机制。

有耐心做好简单事情,坚持写blog 1109

Git 的核心命令一共包含哪些部分?使用场景是什么?底层原理是什么?

Git 是一个分布式版本控制系统,其核心命令涵盖了从仓库初始化到提交、分支管理、远程操作等多个方面。通过掌握 Git 的核心命令,可以高效地管理和协作开发项目!

长风破浪会有时的博客 1174

GIT基本概念、核心命令及底层原理

part 01:GIT基本概念与核心命令 1、基本概念 git是一个分布式的版本管理系统 git把内容按元数据方式存储 2、git核心命令的使用 初始化:git init名称 把文件添加到暂存区:git add文件名、git add -A (全部文件添加进去) 把文件从暂存区删除:git rm --cached文件名 从暂存区提交到本地仓库:git commit文件名/-am(全部文件) -m '注释' 查看文件状态:git sta...

么古的博客 360

【Git 核心原理与实战·上篇】本地仓库管理全解析:从原理到实战

本文是Git入门与核心原理的上篇,重点讲解了本地仓库管理的核心概念和实战技巧。主要内容包括: 版本控制必要性:解决文件版本混乱问题,特别适合文本文件管理。 Git基础配置:安装方法和首次使用的身份设置。 三大区域原理:工作区、暂存区(.git/index)和版本库(.git)的交互关系。 核心操作流程:通过add和commit实现文件版本管理,分析常见错误案例。 Git设计哲学:Git跟踪的是"修改"而非"文件"本身。 .git目录探秘:解析HEAD指针、分支引用和objects对象存储机制,揭示Git高效

2403_87581574的博客 511

Git核心原理详解

Git 的核心是内容寻址对象数据库:commit、tree、blob 通过哈希互相引用;分支只是可移动的指针;merge 三方对比生成双父提交,rebase 则重写历史生成全新哈希;reset 三模式依次影响指针、暂存区、工作区;远程协作本质是两个对象库互传数据并同步引用。理解这些原理,命令行为便可自然推导。

onelastkiss9的博客 480

Git核心原理、实操用法与核心重点详解

本文系统介绍了Git分布式版本控制系统的核心架构与使用方法。Git通过分布式存储和快照式版本管理,解决了传统开发中的文件丢失、版本混乱等问题。主要内容包括:1)Git的分布式架构原理,区分远程中央仓库和本地仓库;2)本地仓库初始化与.git目录解析;3)首次使用的全局账号配置;4)本地版本管理的核心指令流程(status/add/commit);5)远程仓库关联与代码同步方法;6)Git操作规范与注意事项。文章强调规范使用Git能有效提升开发安全性和协作效率,是开发者必备的基础技能。

2503_93701293的博客 702

Git LFS核心原理剖析:如何让Git高效处理大型二进制文件

你是否遇到过Git仓库体积暴增、克隆速度变慢、分支切换卡顿的问题?特别是当项目中包含大量图片、设计稿、视频等大型二进制文件时,传统Git的工作方式会让这些问题雪上加霜。本文将深入解析Git LFS(Large File Storage)的核心原理,展示它如何通过巧妙的设计解决这些痛点,让你彻底理解为什么这个Git扩展能让大型文件管理变得高效而简单。 读完本文你将掌握: - Git处理大型文件的原...

gitblog_00923的博客 892

GIT核心命令及原理

原理 基本使用 本地初始化GIT仓库 # 基于远程仓库克隆至本地 git clone <remote_url> # 当前目录初始化为git本地仓库 git init <directory> 本地添加 # 添加指定文件至暂存区 git add <fileName> # 添加指定目录至暂存区 git add <directory> # 添加所有 git add -A # 将指定目录及子目录移出暂存区 git rm --cac.

u011414629的专栏 227

GitHack核心原理深度解析:理解.git泄漏利用机制

GitHack是一款专业的.git泄漏利用工具,能够从存在配置错误的网站中还原历史版本文件。本文将深入解析GitHack的工作原理,帮助您理解这种强大的安全测试工具如何运作。无论您是安全研究人员还是网站管理员,了解GitHack的机制都至关重要。 ## 为什么.git泄漏如此危险? 🔍 Git是当今最流行的版本控制系统,许多开发者在部署网站时可能无意中将`.git`目录上传到生产服务器。这个

gitblog_00665的博客 1111

Git学习(三)Git核心原理

Git核心工作原理

DJ的博客 227
上一篇: Spring Boot+Mybatis-Plus+MySQL环境搭建
下一篇: 服务器环境安装一条龙
rookiecoder2
博客等级 码龄8年 6粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值