学习git: tree-ish表达式笔记

Git使用-理解tree-ish表达式

~~~~~

学习视频:http://edu.51cto.com/course/course_id-1838.html整理

~~~~~

在.git隐藏文件夹中有一个HEAD文件,文件内容是 refs: refs/heads/master,后面是文件路径,而且在.git隐藏文件夹子路径中确实有master这个文件。在master文件的内容是一个Hash值

$ cat refs/heads/master
86a4a0ecd556382aac675869697e19b7dc3f37b7

查看下这个hash值是代表什么意思,看下面命令,知道是一个commit对象;

$ git cat-file -t 86a4a0ecd556382aac675869697e19b7dc3f37b7
commit

查看下上面的hash值代表那个commit对象

$ git log --oneline//--oneline是把commit对象一行表示,如果直接输入git log则会显示更详细的信息。
86a4a0e Resolved the error: git-write-tree: error building trees
0a0a839 commit for README.txt
961c039 commit again about git stash
7bbb17b commit a change before git stash
7da29f3 rename READMe back
5d53c07 rename readme.txt to README.md
02a0235 am parameter is used to commit
59f6508 learn AM,etc modifier bit or identier bit
21a9441 add the file: .gitignore
c0a6d2b remove the .class files
7e84ca2 contains class file

从上面结果可以看到Master中是第一个commit对象

其实refs/head/master中的master代表是一个分支

见下图,Head指针指向Master这个branch,而master branch指向第一个commit对象

也就是HEAD指针间接指向第一个commit对象

HEAD指针前移一位是head~ (head后面接波浪线),如果移动四个可以简写为head~4

其实移动master也是可以的,比如前移四位,用master~4

下面用命令来验证上面的结论

$ git rev-parse HEAD//git rev-parse命令将各种引用表示法转换为哈希值等。
86a4a0ecd556382aac675869697e19b7dc3f37b7
$ git rev-parse HEAD~//如果向前移动一位,则commit对象hash值
0a0a839a0b9a6d83e929b4f0032beb8c52aff567
$ git rev-parse HEAD~4//如果向前移动4位,则commit对象hash值
7da29f3eb0bbc31fd6ac03a3edc74766b58851fa
$ git rev-parse master~4
7da29f3eb0bbc31fd6ac03a3edc74766b58851fa

从上面可以看到master~4和head~4的commit的hash值是相等的,也就是说head~4和Maser~4是一样的。

如果在Head~4的commit有个tree,则用head~4^{tree}表示那个tree的hash值

$ git rev-parse HEAD~4^{tree}
b78bc334b1b124eb9d20c18f16196da6a53fe582
$ git cat-file -t b78bc334b1b124eb9d20c18f16196da6a53fe582
Tree

从上面的命令可以看到那个hash值的属性确实是tree

$ git cat-file -p b78bc334b1b124eb9d20c18f16196da6a53fe582
100644 blob 6b468b62a9884e67ca19b673f8e14e1931d65036    .gitignore
040000 tree 8610217befecc1950027145225089397451bcb00    basic

直接快速定位到.gitignore文件的方法: HEAD~4:.gitignore

$ git rev-parse HEAD~4:.gitignore
6b468b62a9884e67ca19b673f8e14e1931d65036

显示.gitignore文件内容的方法,2个命令都可以:

$ git cat-file -p HEAD~4:.gitignore
*.class
$ git show HEAD~4:.gitignore
*.class

以上内容统称为:tree-ish

时间: 2024-10-06 08:13:17

学习git: tree-ish表达式笔记的相关文章

学习git: git分支笔记

学习视频:http://edu.51cto.com/course/course_id-1838.html整理 Git学习-git分支 在git中branch就是一个文本,放了一个hash值:其中git branch命令会列出所有的branch $ git branch * master $ git branch --list * master 创建branch命令就是git branch <branch_name>, 比如创建一个web分支 $ git branch web $ git bra

【Tools】Pro Git 一二章读书笔记

记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧. Pro Git (Scott Chacon) 读书笔记: 第一章:Git起步 版本控制出现的原因及分类 类别 基本原理 优点 缺点 本地版本控制系统 自己把复制整个项目,改名或加上备份时间来区别 采用某种简单的数据库来记录文件的历次更新差异 简单 有时会混淆所在的工作目录, 丢了文件毛了数据就没有后退的路 集中化的版本控制系统 解决在不同系统上的开发者协同工作,

[Git00] Pro Git 一二章读书笔记

记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧. Pro Git (Scott Chacon) 读书笔记: 第一章:Git起步 版本控制出现的原因及分类 类别 基本原理 优点 缺点 本地版本控制系统 自己把复制整个项目,改名或加上备份时间来区别 采用某种简单的数据库来记录文件的历次更新差异 简单 有时会混淆所在的工作目录, 丢了文件毛了数据就没有后退的路 集中化的版本控制系统 解决在不同系统上的开发者协同工作,

Android深度探索(卷1)HAL与驱动开发 第三章 Git使用入门 读书笔记

Android深度探索(卷1)HAL与驱动开发 第三章 Git使用入门 读书笔记     本章是对Git的一个概述. Linux是一个开源的系统.事实上,在Linux上许多软件都和底层程序以及内核驱动有关,然而Linux内核的版本非常多,如果每个版本上的软件都采用安装包的形式,则匹配这么多版本的安装包将十分庞大.所以有很多软件不是以二进制安装包的形式来安装和使用的.而是将源代码下载下来,并在每个用户自己的Linux中编译并安装,即使用make 和make install 命令.而Linus作为L

深入理解学习Git常用工作流

个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎star查看最新更新内容, https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md - 我们以使用SVN的工作流来使用git有什么不妥? - git 方便的branch在哪里,团队多人如何协作?冲突了怎么办?如何进行发布

Git专题--系统的学习Git之一

本文为整理自:伯乐在线 1.Git详解之一:Git起步 2.Git详解之二:Git基础 3.Git详解之三:Git分支 4.Git详解之四:服务器上的Git 5.Git详解之五:分布式Git 6.Git详解之六:Git工具 7.Git详解之七:自定义Git 8.Git详解之八:Git与其他系统 9.Git详解之八:Git与其他系统 Git详解之一:Git起步 起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置

深入学习 Git 工作流

原文  https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解: 我们以使用SVN的工作流来使用git有什么不妥? git 方便的branch在哪里,团队多人如何协作?冲突了怎么办?如何进行发布控制? 经典的master-发布.develop-主开发.hotfix-不过修

学习GIT 版本控制的好去处

廖雪峰的官方网站 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 作者不仅仅是做技术 还有产品思维 讲解详细 从需求出发 更有操作了练习 加深记忆 最重要的是简短 易懂 实验楼 远程网页链接虚拟机 在虚拟机里面操作学习git http://www.shiyanlou.com/courses/4

Struts中的OGNL和EL表达式笔记

Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1.访问非根对象属性,如类似于#session.msg表达式,由于Struts2的值栈被当做根对象, 所以访问其他非根对象时,需要加#符号. #符号相当于ActionContext.getContext( ): #session.msg表达式相当于ActionContext.getContext().