今天我通过在线阅读这篇文档来学习一些基本的 git 知识:
http://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-Hi
在该章中,我开始学习如何git log --pretty=format:" "
根据自己的喜好显示日志信息。
但不知怎么的,我在格式表中看到了两个类似的选项,%H
for Commit Hash
、%P
forParent Hash
和%T
for Tree Hash
。
我在命令行上对它们进行了实验,结果发现它们都是长度相同但值不同的哈希值。
我用谷歌搜索和 stackoverflowed,到目前为止没有明显的提示。
我对此有所了解Hash value
,它是 git 提交的校验和。
但它的作用Parent Hash
和Tree hash
作用是什么?
- PS:啊,我现在有了一些想法,这是否
Parent Hash
意味着分支的直接起源的哈希值?
答案1
父哈希:
$ git log --graph
* commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e
|\ Merge: 79e6924 3113760
| | Author: linjie <[email protected]>
| | Date: Mon Mar 14 16:02:09 2016 +0800
| |
| | commit5
| |
| | Merge branch 'dev'
| |
| * commit 31137606f85d8960fa1640d0881682a081ffa9d0
| | Author: linjie <[email protected]>
| | Date: Mon Mar 14 16:01:26 2016 +0800
| |
| | commit3
| |
* | commit 79e69240ccd218d49d78a72f33002fd6bc62f407
|/ Author: linjie <[email protected]>
| Date: Mon Mar 14 16:01:59 2016 +0800
|
| commit4
|
* commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d
| Author: linjie <[email protected]>
| Date: Mon Mar 14 16:01:00 2016 +0800
|
| commit2
|
* commit 316dd3fb3c7b501bc9974676adcf558a18508dd4
Author: linjie <[email protected]>
Date: Mon Mar 14 16:00:34 2016 +0800
commit1
$ git log --pretty=format:'%<(82)%P %s'
79e69240ccd218d49d78a72f33002fd6bc62f407 31137606f85d8960fa1640d0881682a081ffa9d0 commit5
7fd4e3fdddb89858d925a89767ec62985ba07f3d commit4
7fd4e3fdddb89858d925a89767ec62985ba07f3d commit3
316dd3fb3c7b501bc9974676adcf558a18508dd4 commit2
commit1
你可以看到提交4和提交3是 的父级提交5,提交2是 的父级提交3和提交4,提交1是 的父级提交2。
树哈希:
$ git log --pretty=format:'%T %s'
f3c7cee96f33938631a9b023ccf5d8743b00db0e commit5
e0ecb42ae45ddc91c947289f928ea5085c70b208 commit4
d466aea17dc07516c449c58a73b2dc3faa9d11a1 commit3
b39f2e707050e0c5bbb3b48680f416ef05b179ba commit2
5706ec2b32605e27fa04cbef37d582325d14dda9 commit1
$ git cat-file -p f3c7ce
100644 blob 8bb2e871e94c486a867f5cfcbc6f30d004f6a9e5 dev
100644 blob 47f16c8e00adba77ec5c176876e99c8e9f05d69b master
$ git cat-file -p 5706ec
100644 blob fc0bfde0d44bb4d6c7d27b6e587ebedd34ba5911 master
<object>
该命令的功能:根据其类型漂亮地打印其内容。
git cat-file -p
在 git 中,所有内容都存储为树和 blob 对象,其中树对应于 UNIX 目录条目,而 blob 或多或少对应于 inode 或文件内容。单个树对象包含一个或多个树条目,每个树条目都包含指向 blob 或子树及其关联模式、类型和文件名的 SHA-1 指针。 Git 通常通过获取暂存区域或索引的状态并从中写入一系列树对象来创建树。提交对象包含有关谁保存了树对象、保存时间或保存原因的信息。这是提交对象为您存储的基本信息。
结论:
提交哈希、父哈希、树哈希都是 SHA-1。提交哈希和父哈希是相同的,只是父哈希有子哈希。树哈希代表一个树对象。提交哈希和父哈希代表提交对象。
参考:
答案2
A树是文件和目录的分层集合,不依赖于历史上的任何特定点。例如,如果您创建一个文件,然后删除该文件(没有其他干预提交),那么您最终将得到与开始时相同的树。
A犯罪是您项目历史上的一个点。提交指定一棵树,但还包含其他信息,例如作者/提交者和时间、提交消息(其中作者描述了更改的内容),以及最重要的零个或多个父项,它们是存储库的先前状态。 (您的第一个提交有零个父项。此后的大多数提交在线性开发期间都有一个父项,如果您合并,则有多个父项。)
您可以通过该命令了解它是如何工作的git cat-file -p
,该命令打印特定哈希的内容,无论类型如何。例如,要查看 HEAD 提交,您可以运行:
$ git cat-file -p HEAD
tree 81ca1cb660ea79131336944df28b13b711d93557
parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233
parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83
author Mislav MarohniÄ <[email protected]> 1436468108 -0700
committer Mislav MarohniÄ <[email protected]> 1436468108 -0700
Merge pull request #951 from github/global-args
Avoid depending on a hardcoded list of git global flags
要查看该提交内的树,您可以查看cat-file -p
它的树:
$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5 .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03 .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278 CONTRIBUTING.md
...
同样,如果您查看父母,您也会看到这些都是提交。提交内树的简写,例如rev
is rev^{tree}
。所以前面的命令是可以写的git cat-file -p HEAD^{tree}
。请注意,rev^
代表 的父级rev
。当有多个父母时,rev^1
、rev^2
等。更多信息可在git rev-parse 手册页。
答案3
“提交哈希”是当前提交的哈希。与条目关联的提交。
“父哈希”是提交来自的任何父分支的哈希。
“树哈希”是提交中当前目录的哈希。如果从带有 的父目录查看,该哈希值等于该目录的哈希值git ls-files --stage --abbrev
。
参考: