标签:
今天想了解git blame 是从怎样获取文件中每行的owner的?要深入了解git command 还是很有必要了解git 的工作原理的。今后将git 常用命令的工作原理相关的东东整理在这里:
SHA:所有用来表示项目历史信息的文件,是通过一个40个字符的(40-digit)“对象名”来索引的。
SHA-1是一种加密哈希函数(cryptographic hash function),另外两种SHA(secure hash algorithm)算法是SHA-0和SHA-2。SHA-1将文件中的内容通过其hash算法生成一个160bit的报文摘要,即40个十六进制数字(每个十六进制数字占4位)。它几乎可以保证,如果两个文件的SHA-1值是相同的,那么它们确是完全相同的内容(类似于生活中的指纹识别);不过也不是绝对的安全可靠,最新资料显示,理论上对其进行哈希碰撞(hash collision,不同的两块数据有相同的hash值)的攻击可以在2^51(2的51次方)左右的次数内实现。(BTW,国内也有对密码攻击研究深入的学者,我就看到wikipedia上经常提到山东大学的王小云[Wang Xiaoyun]教授,有兴趣研究密码破译攻击的,可以google其论文来读读。)由于SHA-1不是足够的安全,现在美国的很多政府部门都开始不采用SHA-1而采用SHA-2(256/224/512/384等多种长度的输出报文摘要,目前还没有发现其hash碰撞的存在)。SHA-1主要有两种用途,一个是加密,一个是数据完整性校验。
这样做的好处是:
Git只要比较对象名,就可以很快的判断两个对象是否相同;
Git还可以通过检查对象名内容的SHA1的哈希值和“对象名”是否相同,来判断对象内容是否正确。
git 划分三个区域:
(1)working directory:
(2)staging area:
(3)git repository:
git 每个object包括三个部分:类型,大小和内容,四类对象:
(1)blob: 用于表示一个文件,存储文件数据
(2)tree:用于表示一个目录,管理一些“tree”或是“blob”
(3)commit:指向一个“tree”,用来标记项目某个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳,最近一次提交的作者,指向上一次提交(commit)的指针等等。
(4)tag:用来标记某一次提交(commit)的方法
与“增量文件系统”(Delta Storage System)不同,Git会把每次提交的文件内容(snapshot)都记录下来。
所有这些对象都会以文件形式保存在.git/objects目录,一个对象对一个文件
我在【working directory】新建一个文件 file1,git add到【staging area】,然后git commit -m "add file1"提交到【git repository】
git log commit a7c9f0464fc6d198d4e51c9752da4a58b8a34f3a Author: XXXX <LLL@XXXX.com> Date: Fri Jul 3 13:35:33 2015 +0800 add file1
find .git/objects -type f ./ba/8d37db42d65db009cc08924df452c8a9257079 ./4a/fbbf134a8f2653b578727fe102097f6ec5f883 ./a7/c9f0464fc6d198d4e51c9752da4a58b8a34f3agit 用SHA-1的钱两个数字来分目录存储对象,因此上述三个对象是
ba8d37db42d65db009cc08924df452c8a9257079 #blob 4afbbf134a8f2653b578727fe102097f6ec5f883 #tree a7c9f0464fc6d198d4e51c9752da4a58b8a34f3a #commit用
git cat-file -t <SHA1> #查看对象type git cat-file -p <SHA1> #查看对象内容
git cat-file -t a7c9f0464fc6d198d4e51c9752da4a58b8a34f3a commit $git cat-file -p a7c9f0464fc6d198d4e51c9752da4a58b8a34f3a tree 4afbbf134a8f2653b578727fe102097f6ec5f883 author LLL <LLL@XXX.com> 1435901733 +0800 committer LLL <LLL@XXX.com> 1435901733 +0800 add file1SHA1相关命令:
git hash-object file
git show <SHA1>
git log --pretty=oneline
这会给出commit的历史记录。每行行首显示了每次提交的SHA1值。然后用
git show <SHA1>
显示commit的内容。
git rev-parse 5ca6fc^{tree}
会显示5ca6fc指向的tree的SHA1。如果想进一步查看tree的内容,用命力
git show 5ca6fc^{tree}
或者
git cat-file -p 5ca6fc^{tree}
后者输出形如
100644 blob 76018072e09c5d31c8c6e3113b8aa0fe625195ca file1 100644 blob 5716ca5987cbf97d6bb54920bea6adde242d87e6 file2 100644 blob 10e2d16377371e6436ba3779e62381fdaf8fcfbf file3 040000 tree edf40c2308b255c4aebc34aa9cce134131778a14 src
可以看出,这个tree包含三个blob和一个子tree。
git tag
列出所有的tag。对于某个tag “v1”,用命令
git rev-parse v1
查看tag的SHA1值。
标签:
原文地址:http://my.oschina.net/u/347414/blog/474045