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