【Git 学习笔记】Ch1.1 Git 简介 + Ch1.2 Git 对象
还是绪个言吧
今天整理 GitHub 仓库,无意间翻到了几年前自学 Git 的笔记。要论知识的稳定性,
Git应该能挤进前三——只要仓库还在,理论上当时的所有开发细节都可以追溯出来。正好过段时间会用到 Git,现在整理出来就当温故知新了。
当时找的学习资料是 Packt 出版社于 2018 年出版的一本电子书 Git Version Control Cookbook, Second Edition,直译过来就是《Git 版本控制手册》,作者有两位,一位来自丹麦,另一位来自意大利。选这本书来啃的原因也很简单:重实操,上手快,最关键还免费(同事转发的)。反正比看 Git 文档强多了。需要本书电子版的朋友可以在评论区给我留言。
P.S. 示例仓库点这里:GitHub
第一章 浏览 Git
相关主题:
- Git 对象模型
- Git 的三个阶段(stages)
- 查看有序无环图 (DAG)
- 提炼已修复事项
- 获取变动文件列表
- 使用
gitk查看提交历史 - 在历史记录中查找提交版本
- 在历史代码中搜索信息
1.1 简介
传统版本管理系统:记录初始文件,以及后续变更。

Git:记录所有文件的快照。

Git 的数据模型:

commit 对象指向 根节点树 root tree,根节点树又指向各子树(subtrees)与文件(files)
分支和标签指向 commit 对象,而 HEAD 对象指向当前签出的分支 branch。因此对于每一个版本,其指向的根节点树 都是相同的。
1.2 Git 对象
Git 对象是按键值对的形式存储。这个 键,用的是该对象的 SHA-1 哈希值,外加一些额外属性(如大小)。
Git 共有四种对象类型:
- 文件
Files(在 Git 语境下也称 二进制大对象 blob) - 目录
Directories(在 Git 语境下也称 树) - 版本
Commits - 标签
Tags
而 HEAD 是一个特殊的指针,指向当前签出的 branch 分支。
查看并打印 HEAD 标签指向的 commit 对象:
$ git cat-file -p HEAD
由于 HEAD 指向 master(现在叫 main)分支,master 分支又指向最近一次提交的版本 commit。
1.2.1. tree 对象
用同样的方式查看 tree:(SHA-1)
$ git cat-file -p 34fa038544bcd9aed660c08320214bafff94150b
或使用 <rev>^<type> 式引用:
# on Linux
$ git cat-file -p HEAD^{tree}
# on Windows
PS> git cat-file -p 'HEAD^{tree}'
注:<rev>^<type> 返回从 rev 递归查找到的第一个 type 型对象。
1.2.2. blob 对象
用该命令继续查看 blob 对象:(使用 SHA-1)
$ git cat-file -p 92f046f17079aa82c924a9acf28d623fcb6ca727
这里的 -p 即 pretty print,格式化输出。常用的选项还有:
-s: 显示对象大小(size)-t: 显示对象类型(type)-e: 检查是否存在(exist),不存在则报错,否则返回状态0(无返回)
1.2.3. branch 对象
该命令也可以作用于 master 分支:(现在默认为 main 分支)
$ git cat-file -p master
此外,在 .git 文件夹内也能查看 master 分支指向的 commit 的 ID,使用 cat 命令:
$ cat .git/refs/heads/master
# 2aa0ed57af1e4e35596616e7beee758e96b5e88c
要验证该结果是否为最新的版本,使用 git log -1:

查看 HEAD:(现在默认叫 main 分支)
$ cat .git/HEAD
# ref: refs/heads/master
由此可见,branch 分支只是一个指向 commit 对象的指针。
1.2.4. tag 对象
标签有三类:
- 轻量标签
- 注解标签
- 签名标签
查看注解标签,使用 git tag :
$ git tag
v0.1
v1.0
进一步查看标签 v1.0:
$ git cat-file -p v1.0

可见,标签由以下部分组成:
- 对象(object):此处即
master分支的最新commit - 类型(type):为
commit型(commits、blobs与trees都可以添加标签) - 标签名(tag name):
v1.0 - 贴标签人(tagger)及时间戳(timestamp):
John Doe <john.doe@example.com> 1526017989 +0200 - 标签注释内容(tag message):
We got the hello world C program merged, let's call that a release 1.0
还可以通过使用命令 git hash-object 重散列(rehashing)来验证 git cat-file 的结果;例如,验证 HEAD 指向的 commit:
$ git cat-file -p HEAD | git hash-object -t commit --stdin
# 2aa0ed57af1e4e35596616e7beee758e96b5e88c
该结果可以用 git log 作对比:
$ git log -1 | grep commit
# commit 2aa0ed57af1e4e35596616e7beee758e96b5e88c
命令 git cat-file -p 虽然少见,但查看对象信息、了解各对象的构成情况却很方便。除了这个命令外,查看一个 tree 对象也可以使用 git ls-tree 或 git show,只是结果显示的方式不同罢了:
$ git cat-file -p HEAD^{tree}
100644 blob f21dc2804e888fee6014d7e5b1ceee533b222c15 README.md
040000 tree abc267d04fb803760b75be7e665d3d69eeed32f8 a_sub_directory
100644 blob b50f80ac4d0a36780f9c0636f43472962154a11a another-file.txt
100644 blob 92f046f17079aa82c924a9acf28d623fcb6ca727 cat-me.txt
100644 blob bb2fe940924c65b4a1cefcbdbe88c74d39eb23cd hello_world.c
$ git ls-tree HEAD^{tree}
100644 blob f21dc2804e888fee6014d7e5b1ceee533b222c15 README.md
040000 tree abc267d04fb803760b75be7e665d3d69eeed32f8 a_sub_directory
100644 blob b50f80ac4d0a36780f9c0636f43472962154a11a another-file.txt
100644 blob 92f046f17079aa82c924a9acf28d623fcb6ca727 cat-me.txt
100644 blob bb2fe940924c65b4a1cefcbdbe88c74d39eb23cd hello_world.c
$ git show HEAD^{tree}
tree HEAD^{tree}README.md
a_sub_directory/
another-file.txt
cat-me.txt
hello_world.c
相关文章:
【Git 学习笔记】Ch1.1 Git 简介 + Ch1.2 Git 对象
还是绪个言吧 今天整理 GitHub 仓库,无意间翻到了几年前自学 Git 的笔记。要论知识的稳定性,Git 应该能挤进前三——只要仓库还在,理论上当时的所有开发细节都可以追溯出来。正好过段时间会用到 Git,现在整理出来就当温故知新了。…...
Python 中别再用 ‘+‘ 拼接字符串了!
目录 引言 为什么不推荐使用 "" 示例代码 更高效的替代方法 使用 join 方法 示例代码 使用格式化字符串(f-strings) 示例代码 引言 大家好,在 Python 编程中,我们常常需要对字符串进行拼接。你可能会自然地想到…...
六西格玛绿带培训的证书有什么用处?
近年来,六西格玛作为一套严谨而系统的质量管理方法,被广泛运用于各行各业。而六西格玛绿带培训证书,作为这一方法论中基础且重要的认证,对于个人和企业而言,都具有不可忽视的价值。本文将从多个角度深入探讨六西格玛绿…...
《妃梦千年》第二十章:风雨欲来
第二十章:风雨欲来 战斗的胜利让林清婉和皇上的关系更加亲密,但宫中的阴谋却并未因此而停止。一天,林清婉正在寝宫中思考未来的对策,忽然接到一个紧急消息。小翠匆匆跑来,神色紧张:“娘娘,太后…...
深入理解二分法
前言 二分法(Binary Search)是一种高效的查找算法,广泛应用于计算机科学和工程领域。它用于在有序数组中查找特定元素,其时间复杂度为 O(log n),显著优于线性搜索的 O(n)。本文将深入介绍二分法的原理、实现及其应用场…...
【C命名规范】遵循良好的命名规范,提高代码的可读性、可维护性和可复用性
/******************************************************************** * brief param return author date version是代码书写的一种规范 * brief :简介,简单介绍函数作用 * param :介绍函数参数 * return:函数返回类型说明 * …...
Hbase面试题总结
一、介绍下HBase架构 --HMaster HBase集群的主节点,负责管理和协调整个集群的操作。它处理元数据和表的分区信息,控制RegionServer的负载均衡和故障恢复。--RegionServer HBase集群中的工作节点,负责存储和处理数据。每个RegionServer管理若…...
C语言部分复习笔记
1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高,p先和 [] 结合说明p是一个数组,p先和*结合说明p是一个指针 括号保证p先和*结合,说明p是一个指针变量,然后指…...
Rust学习笔记 (命令行命令) : 用override set 设置工具链
在cargo run某个项目时出现了如下错误:error: failed to run custom build command for ring v0.16.20(无法运行“Ring v0.16.20”的自定义构建命令),在PowerShell命令行运行命令 rustup override set stable-msvc后成功运行。 o…...
cv::Mat类的矩阵内容输出的各种格式的例子
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 功能描述 我们可以这样使用:cv::Mat M(…); cout << M;,直接将矩阵内容输出到控制台。 输出格式支持多种风格,包括O…...
Redis--注册中心集群 Cluster 集群-单服务器
与“多服务器集群”一致需要创建redis配置模板 参照以下链接 CSDN 创建redis容器 node01服务器上创建容器 docker run -d --name redis-6381 --net host --privilegedtrue \ -v /soft/redis-cluster/6381/conf/redis.conf:/etc/redis/redis.conf \ -v /soft/redis-cluster/6…...
CV01_相机成像原理与坐标系之间的转换
目录 0.引言:小孔成像->映射表达式 1. 相机自身的运动如何表征?->外参矩阵E 1.1 旋转 1.2 平移 2. 如何投影到“像平面”?->内参矩阵K 2.1 图像平面坐标转换为像素坐标系 3. 三维到二维的维度是如何丢失的?…...
Android Lint
文章目录 Android Lint概述工作流程Lint 问题问题种类警告严重性检查规则 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量…...
【算法刷题 | 动态规划14】6.28(最大子数组和、判断子序列、不同的子序列)
文章目录 35.最大子数组和35.1题目35.2解法:动规35.2.1动规思路35.2.2代码实现 36.判断子序列36.1题目36.2解法:动规36.2.1动规思路36.2.2代码实现 37.不同的子序列37.1题目37.2解法:动规37.2.1动规思路37.2.2代码实现 35.最大子数组和 35.1…...
vue3 vxe-grid列中绑定vxe-switch实现数据更新
1、先上一张图: <template #valueSlot"{ row }"><vxe-switch :value"getV(row.svalue)" change"changeSwitch(row)" /></template>function getV(value){return value 1;};function changeSwitch(row) {console.l…...
Hive SQL:实现炸列(列转行)以及逆操作(行转列)
目录 列转行行转列 列转行 函数: EXPLODE(ARRAY):将ARRAY中的每一元素转换为每一行 EXPLODE(MAP):将MAP中的每个键值对转换为两行,其中一行数据包含键,另一行数据包含值 数据样例: 1、将每天的课程&#…...
MD5算法详解
哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有:MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法,用于消息认证。 数据存储方式:小段存储。 数据填充 首先对我们明文数据进行处理,使其…...
ES6的代理模式-Proxy
语法 target 要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理handler 一个通常以函数作为属性的对象,用来定制拦截行为 const proxy new Proxy(target, handle)举个例子 <s…...
排序(堆排序、快速排序、归并排序)-->深度剖析(二)
前言 前面介绍了冒泡排序、选择排序、插入排序、希尔排序,作为排序中经常用到了算法,还有堆排序、快速排序、归并排序 堆排序(HeaSort) 堆排序的概念 堆排序是一种有效的排序算法,它利用了完全二叉树的特性。在C语言…...
七一建党节|热烈庆祝中国共产党成立103周年!
时光荏苒,岁月如梭。 在这热情似火的夏日, 我们迎来了中国共产党成立103周年的重要时刻。 这是一个值得全体中华儿女共同铭记和庆祝的日子, 也是激励我们不断前进的重要时刻。 103年, 风雨兼程,砥砺前行。 从嘉兴…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
