git使用三

本章将围绕对象数据库和索引文件展开,便于理解git的工作机制和原理
1. 先建立一个git仓库
$ mkdir test-project
$ cd test-project
$ git init
$ echo ‘Hi, sinaxyz’>file.txt
$ git add .
$ git commit -a -m “initial commit” //此处的-m选项表示“后面的参数是本次提交的历史记录”
$ echo ‘Hi, sinaxyz!’>file.txt
$ git commit -a -m “add emphasis”
$ git log //使用log命令查看一下
通过前面所学可知,git会对每次commit生成一个长串的十六进制(共40位),这是一个SHA1哈希数,保证每次commit后生成的值都是唯一的。
 
$ git cat-file -t 241e //cat-file命令中-t选项表示列出相应ID的对象类型;241e是刚才commit后得出的SHA1码
commit //可以看到此ID对应的对象类型为一次commit
$ git cat-file commit 241e //此处的commit表示要查询的是一个对象类型为commit的对象,后面给出此对象的ID
tree 9a327d5e3aa818b98ddaa7b5b369f5deb47dc9f6
命令输出结果中包含了tree,tree的ID表示了一个BLOB对象(二进制对象),此对象对应着一个文件或另一个tree。你可以使用ls-tree命令来查询关于这个tree的更详细信息:
$ git ls-tree 9a327
100644 blob 7d4e0fa616551318405e8309817bcfecb7224cff file.txt
可以看到9a327这棵树上包括了一个file.txt文件,其ID为7d4e0f
 
$ git cat-file -t 7d4e0f
$ git cat-file blob 7d4e0f
可以看到7d4e0f对应的对象的类型是blob,而其内容就是“Hi, sinaxyz”
 
2. 所有的对象信息都存储在.git/objects/目录下,使用find命令可以看到。
这些对象都是被压缩过的,其类型可以是blob,tree,commit或tag。其中包括了对象长度、对象类型和对象的内容。
 
3. 在.git目录下的HEAD文件比较特殊,查看.git/HEAD文件:
$ cat HEAD
$ git branch
可以看到HEAD文件指示出当前所在的分支名称是master。其实更引起我们兴趣的是HEAD文件中所指示的这个路径“refs/heads/master”
HEAD所指向的是最后一次commit的信息,而且经测试可知parent指的是上一次commit的信息。
 
因此总的来说,对象数据库的管理方式是,commit对象会指向一个tree对象,即在历史记录中当前结点的tree目录的镜像;也会指向父母(parent)commit,这是为了和之前的commit建立关联。
tree对象用于显示一个目录的状态,tree对象中包含了blob对象和子目录对象。
blob对象包含的是文件的数据。
每个分支的HEAD会存储在.git/refs/heads中。同时,当前所在分支的头部会存储在.git/HEAD中。
 
4. 通过上面介绍的索引文件的作用。我们在提交工作时,使用最多的命令就是git commit -a了,但是这个将提交你所做的所有工作。其实,如果你了解commit的工作机制,你会知道我们可以自定义提交哪些部分到哪些工作树中,其实自由度很大的。
$ echo “Hi, sinaxyz!!!”>>file.txt
$ git diff //不急着执行commit命令,而是先用git diff看看差别情况
$ git add file.txt //add一下,然后再git diff,看看diff有什么变化
$ git diff //输出为空
$ git diff HEAD //看到修改报告
这就说明了一个问题:git diff不是在和HEAD比,而是和另外一个“神秘”内容在比,而这个“神秘”内容就是“索引文件”!
索引文件(index file)就是.git/index文件,它是二进制形式的文件。我们可以用ls-files来检查它的内容。
结论是git add的作用就是创建一个blob文件来记录最新的修改代码,并且在index file里添加一个到此blob的链接。
 
5. 如果在git-diff后面加上参数HEAD,则git-diff会显示当前工作目录和最近一次提交之间的代码区别。
$ git diff HEAD
如果使用参数–cached,则会比较index file和最近一次提交之间的代码区别。
$ git diff –cached
 
通俗的解释就是:git维护的代码分成三部分,“当前工作目录”<->“index file”<->git仓库。
git commit会将index file中的改变写到git仓库;git add会将“当前工作目录”的改变写到“index file”;“commit -a”则会直接将“当前工作目录”的改动同时写到“index file”和“git仓库”。
 
6. status命令会显示当前状态的一个简单总结:
$ git status
原文地址:https://www.cnblogs.com/sinaxyz/p/2998733.html