当前位置: 首页 > news >正文

【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 solution

Git 的数据模型:

Git data model

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

这里的 -ppretty 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

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

在这里插入图片描述

可见,标签由以下部分组成:

  1. 对象(object):此处即 master 分支的最新 commit
  2. 类型(type):为 commit 型(commitsblobstrees 都可以添加标签)
  3. 标签名(tag name):v1.0
  4. 贴标签人(tagger)及时间戳(timestamp):John Doe <john.doe@example.com> 1526017989 +0200
  5. 标签注释内容(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-treegit 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 仓库&#xff0c;无意间翻到了几年前自学 Git 的笔记。要论知识的稳定性&#xff0c;Git 应该能挤进前三——只要仓库还在&#xff0c;理论上当时的所有开发细节都可以追溯出来。正好过段时间会用到 Git&#xff0c;现在整理出来就当温故知新了。…...

Python 中别再用 ‘+‘ 拼接字符串了!

目录 引言 为什么不推荐使用 "" 示例代码 更高效的替代方法 使用 join 方法 示例代码 使用格式化字符串&#xff08;f-strings&#xff09; 示例代码 引言 大家好&#xff0c;在 Python 编程中&#xff0c;我们常常需要对字符串进行拼接。你可能会自然地想到…...

六西格玛绿带培训的证书有什么用处?

近年来&#xff0c;六西格玛作为一套严谨而系统的质量管理方法&#xff0c;被广泛运用于各行各业。而六西格玛绿带培训证书&#xff0c;作为这一方法论中基础且重要的认证&#xff0c;对于个人和企业而言&#xff0c;都具有不可忽视的价值。本文将从多个角度深入探讨六西格玛绿…...

《妃梦千年》第二十章:风雨欲来

第二十章&#xff1a;风雨欲来 战斗的胜利让林清婉和皇上的关系更加亲密&#xff0c;但宫中的阴谋却并未因此而停止。一天&#xff0c;林清婉正在寝宫中思考未来的对策&#xff0c;忽然接到一个紧急消息。小翠匆匆跑来&#xff0c;神色紧张&#xff1a;“娘娘&#xff0c;太后…...

深入理解二分法

前言 二分法&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;广泛应用于计算机科学和工程领域。它用于在有序数组中查找特定元素&#xff0c;其时间复杂度为 O(log n)&#xff0c;显著优于线性搜索的 O(n)。本文将深入介绍二分法的原理、实现及其应用场…...

【C命名规范】遵循良好的命名规范,提高代码的可读性、可维护性和可复用性

/******************************************************************** * brief param return author date version是代码书写的一种规范 * brief &#xff1a;简介&#xff0c;简单介绍函数作用 * param &#xff1a;介绍函数参数 * return&#xff1a;函数返回类型说明 * …...

Hbase面试题总结

一、介绍下HBase架构 --HMaster HBase集群的主节点&#xff0c;负责管理和协调整个集群的操作。它处理元数据和表的分区信息&#xff0c;控制RegionServer的负载均衡和故障恢复。--RegionServer HBase集群中的工作节点&#xff0c;负责存储和处理数据。每个RegionServer管理若…...

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高&#xff0c;p先和 [] 结合说明p是一个数组&#xff0c;p先和*结合说明p是一个指针 括号保证p先和*结合&#xff0c;说明p是一个指针变量&#xff0c;然后指…...

Rust学习笔记 (命令行命令) : 用override set 设置工具链

在cargo run某个项目时出现了如下错误&#xff1a;error: failed to run custom build command for ring v0.16.20&#xff08;无法运行“Ring v0.16.20”的自定义构建命令&#xff09;&#xff0c;在PowerShell命令行运行命令 rustup override set stable-msvc后成功运行。 o…...

cv::Mat类的矩阵内容输出的各种格式的例子

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 功能描述 我们可以这样使用&#xff1a;cv::Mat M(…); cout << M;&#xff0c;直接将矩阵内容输出到控制台。 输出格式支持多种风格&#xff0c;包括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.引言&#xff1a;小孔成像->映射表达式 1. 相机自身的运动如何表征&#xff1f;->外参矩阵E 1.1 旋转 1.2 平移 2. 如何投影到“像平面”&#xff1f;->内参矩阵K 2.1 图像平面坐标转换为像素坐标系 3. 三维到二维的维度是如何丢失的&#xff1f;…...

Android Lint

文章目录 Android Lint概述工作流程Lint 问题问题种类警告严重性检查规则 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具&#xff0c;它可以帮助我们发现代码结构/质量…...

【算法刷题 | 动态规划14】6.28(最大子数组和、判断子序列、不同的子序列)

文章目录 35.最大子数组和35.1题目35.2解法&#xff1a;动规35.2.1动规思路35.2.2代码实现 36.判断子序列36.1题目36.2解法&#xff1a;动规36.2.1动规思路36.2.2代码实现 37.不同的子序列37.1题目37.2解法&#xff1a;动规37.2.1动规思路37.2.2代码实现 35.最大子数组和 35.1…...

vue3 vxe-grid列中绑定vxe-switch实现数据更新

1、先上一张图&#xff1a; <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:实现炸列(列转行)以及逆操作(行转列)

目录 列转行行转列 列转行 函数&#xff1a; EXPLODE(ARRAY)&#xff1a;将ARRAY中的每一元素转换为每一行 EXPLODE(MAP)&#xff1a;将MAP中的每个键值对转换为两行&#xff0c;其中一行数据包含键&#xff0c;另一行数据包含值 数据样例&#xff1a; 1、将每天的课程&#…...

MD5算法详解

哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有&#xff1a;MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法&#xff0c;用于消息认证。 数据存储方式&#xff1a;小段存储。 数据填充 首先对我们明文数据进行处理&#xff0c;使其…...

ES6的代理模式-Proxy

语法 target 要使用 Proxy 包装的目标对象&#xff08;可以是任何类型的对象&#xff0c;包括原生数组&#xff0c;函数&#xff0c;甚至另一个代理handler 一个通常以函数作为属性的对象&#xff0c;用来定制拦截行为 const proxy new Proxy(target, handle)举个例子 <s…...

排序(堆排序、快速排序、归并排序)-->深度剖析(二)

前言 前面介绍了冒泡排序、选择排序、插入排序、希尔排序&#xff0c;作为排序中经常用到了算法&#xff0c;还有堆排序、快速排序、归并排序 堆排序&#xff08;HeaSort&#xff09; 堆排序的概念 堆排序是一种有效的排序算法&#xff0c;它利用了完全二叉树的特性。在C语言…...

七一建党节|热烈庆祝中国共产党成立103周年!

时光荏苒&#xff0c;岁月如梭。 在这热情似火的夏日&#xff0c; 我们迎来了中国共产党成立103周年的重要时刻。 这是一个值得全体中华儿女共同铭记和庆祝的日子&#xff0c; 也是激励我们不断前进的重要时刻。 103年&#xff0c; 风雨兼程&#xff0c;砥砺前行。 从嘉兴…...

使用 C/C++ 和 OpenCV 添加图片水印

使用 C/C 和 OpenCV 添加图片水印 &#x1f5bc;️ 在数字图像处理中&#xff0c;添加水印是一种常见的操作&#xff0c;可以用于版权保护、品牌宣传或信息标注。本文将介绍如何使用 C/C 和强大的计算机视觉库 OpenCV 来实现将自定义水印&#xff08;图片或文字&#xff09;添…...

idea 启动jar程序并调试

添加一个JAR 应用程序&#xff0c;填写以下内容&#xff1a; JAR路径&#xff1a;填写你要启动的jar程序的绝对路径 虚拟机选项&#xff1a;-Xmx1G -Xms1G -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 程序实参&#xff08;可选&#xff0c;minecraft专用…...

ArkUI-X与Android桥接通信之消息通信

平台桥接用于客户端&#xff08;ArkUI&#xff09;和平台&#xff08;Android或iOS&#xff09;之间传递消息&#xff0c;即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。本文主要介绍Android平台与ArkUI交互&#xff0c;ArkUI侧具体用法请参考…...

【2025CVPR】模型融合新范式:PLeaS算法详解(基于排列与最小二乘的模型合并技术)

本文深入解析ICLR 2025顶会论文《PLeaS: Merging Models with Permutations and Least Squares》,揭示模型融合领域突破性进展. 一、问题背景:模型合并的核心挑战 随着开源模型的爆发式增长,如何高效合并多个专用模型成为关键挑战。传统方法存在三大痛点: ​初始化依赖​…...

JavaWeb预习(jdbc)

基础 1.驱动程序接口Driver 每种数据库都提供了数据库驱动程序&#xff0c;并且都提供了一个实现java.sql.Driver接口的类&#xff0c;称为Driver 对于MySql&#xff0c;其Driver类为com.mysql.jdbc.Driver&#xff0c;加载该类的语句为&#xff1a; Class.forName("c…...

计算机基础知识(第五篇)

计算机基础知识&#xff08;第五篇&#xff09; 架构演化与维护 软件架构的演化和定义 软件架构的演化和维护就是对架构进行修改和完善的过程&#xff0c;目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等&#xff0c;是一个不断迭代的过程&#xff0…...

AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法

目录 软件架构 关键知识点 第一:PDUR的缓存作用 第二:CANTP的组包拆包功能 第三:流控帧的意义 配置过程 步骤0:ECUC模块中PDU创建 步骤1:SoAD模块维持不变 步骤2:DoIP模块为Gateway功能添加Connection ​步骤3:DoIP模块为Gateway新增LA/TA/SA ​步骤4:PDUR模…...

CAN通信收发测试(USB2CAN模块测试实验)

1.搭建测试环境 电脑&#xff1a;安装 USB 驱动&#xff0c;安装原厂调试工具&#xff0c;安装cangaroo&#xff08;参考安装包的入门教程即可&#xff09; USB驱动路径&#xff1a;~\CAN分析仪资料20230701_Linux\硬件驱动程序 原厂调试工具路径&#xff1a;~\CAN分析仪资料2…...

yaffs2目录搜索上下文数据结构struct yaffsfs_dirsearchcontext yaffsfs_dsc[] 详细解析

1. 目录搜索上下文&#xff08;Directory Search Context&#xff09; struct yaffsfs_dirsearchcontext 是 YAFFS2 文件系统中用于 目录遍历操作 的核心数据结构&#xff0c;专门管理 readdir() 等目录操作的状态。 结构体定义&#xff08;典型实现&#xff09; struct yaf…...

分布式爬虫代理IP使用技巧

最近我们讨论的是分布式爬虫如何使用代理IP。在我们日常的分布式爬虫系统中&#xff0c;多个爬虫节点同时工作&#xff0c;每个节点都需要使用代理IP来避免被目标网站封禁。怎么解决代理IP问题显得尤为重要。 我们知道在分布式爬虫中使用代理IP是解决IP封禁、提高并发能力和实…...