Git中有几种对象,像commit、tree、blob、tag,所有这些对象都存放于工作目录中.git/objects/下的各个文件夹中。
举个例子:
当创建一个文件 touch file,然后进行git add file时,上面所说的目录中就会生成一个文件夹(两个英文字符命名的,这里假设是ac),那么在ac目录下会有一个一串(38个)字符命名的文件(假设是8516aa0d9ea6b86d3830f2e179864992f527ad),而ac与8516aa0d9ea6b86d3830f2e179864992f527ad合起来(即:ac8516aa0d9ea6b86d3830f2e179864992f527ad)就是我们刚git add之后,所创建的一个blob对象名,该对象名是一个SHA-1值(40个字符组成,前两个用作目录名,后38个用于文字名),而该blob对象中所存的内容即为file文件的内容。
所以一个文件对应一个blob对象。
而tree对象对应的是目录,其内容是目录中的子目录或文件的名称。
举个例子:
假设工作目录(根目录)里有dir/一个目录,和一个file文件,而dir/目录下又有file1和file2两个文件。那么进行 git add(add all)之后,生成的是三个blob对象(我试了下,当文件中没有内容时,不会生成blob对象,这就是说Git是针对文件中的内容进行SHA-1哈希的),对应这三个文件。此外,还会生成两个 tree 对象,对应工作目录的根目录以及dir/目录。
commit对象是在每次git commit时所生成的,而tag对象是在建立里程碑时所生成的。
Ps:在.git/objects中的所有对象,在不手工(进入该目录,rm -r XXX)进行删除时,这些对象都会一直存在着,这也是为什么在git reset之后,还可以还原的,不过,从那么多对象文件中找出想要还原的commit,犹如大海捞针。但是总是有方法找到的,或许git reflog可以帮助走得更进一步。
理解Git中的对象,能更好的理解分支、HEAD、master等。
前面讲过,用git cat-file -p HEAD:file可以查看HEAD所指向的提交中file的内容,其实,这只是一个小的应用。
所有对象都可以用git cat-file来查看,其中 git cat-file -t <object> 是查看该对象的类型 ,git cat-file -p <object> 是查看该对象的内容, git cat-file -s <object> 是查看该对象的大小。
举个例子:
$ git cat-file -p 6bb994 //(这个是一个commit对象的名字的前5位,不必打出全名,可区别于其他即可)
tree 8fc7e4efa8c47c058272663dc3cafcad52229b9d
parent c2456fcf8fcb8715704d4d4e4e8342c83e344b3e
author kevin <songkang666@126.com> 1366773192 +0800
committer kevin <songkang666@126.com> 1366773192 +0800
可以看出,该commit对象中记录了它所对应的tree对象,前一次提交生成的commit对象(即它的父提交),提交人信息、对该 commit的描述。
最后补充一条很重要的,Git在处理提交时,会把每次提交的文件全部内容(snapshot)都记录下来。
举个例子:file在修改之后,再进行提交时,会新建一个完整地对应于它的blob对象,而不是覆盖掉之前提交时所产生的,也不是只对修改的部分(例如:添加了某些行)建立blob对象。
more:
GIT对象模型(推荐)
《Pro Git》
分享到:
相关推荐
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn...
Learn Version Control With Git A step-by-step course for the complete beginner(中文)。亚马逊接近满分书籍,中文版。图文并茂。学习Git的好资料。 从官网一页一页的复制过来的,花了不少时间。
Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
"Learn Version Control with Git" is a beginner-friendly step-by-step course. The book doesn't require a deep technical background. Instead, it's aimed at beginners of version control and/or ...
《Visual C# Step By Step》是一本经典的C#编程教程,旨在帮助初学者逐步掌握C#语言和.NET Framework的核心概念与应用。这本书通过实例和逐步指导的方式,让读者能够深入理解C#编程的基础以及高级特性。 1. **C#...
在IT行业中,版本控制工具Git是开发者们进行协作和管理代码的重要工具。Git不仅提供了版本回溯、合并分支等基本功能,还支持各种高级操作,如代码统计。本主题聚焦于"Git分支代码统计",这是一项对于项目管理和团队...
git图形化界面操作说明,从创建本地仓库到更新远程仓库,step by step 简单直观。zsbd
Its step-by-step approach with useful information makes this course the ultimate guide to understanding and mastering Git. This course will show the road to mastery example by example, while also ...
* The "git log" command by default behaves as if the --mailmap option was given. UI, Workflows & Features * The "git fast-export/import" pair has been taught to handle commits with log messages...
Step 1: git 用户绑定邮箱 首先,需要将 Git 账号绑定到邮箱上。登录 Git 网站,按照以下步骤操作: 1. 使用邮箱与 Git 绑定。 2. 本地配置个人用户名称和电子邮件地址: ``` git config --global user.name "信笺...
- **git(4).hpi**:这可能是 Git 插件的多个版本之一,用于确保 Jenkins 支持最新的 Git 特性。 - **workflow-api.hpi**:流水线 API 插件提供了编写 Jenkinsfile 的接口,使得定义复杂的构建流程成为可能。 - **...
Step 4: 初始化 Git 存储库 接下来,需要初始化 Git 存储库。可以使用以下命令: ``` git init ``` Step 5: 查看隐藏文件夹 初始化完成后,需要查看隐藏文件夹。可以使用以下命令: ``` dir -a ``` Step 6: 将文件...
- **背景介绍**:本书《Microsoft Visual C# 2013 Step by Step》是针对Visual Studio 2013环境下的C#编程语言的学习指南。它由John Sharp编写,并获得了微软公司的授权出版。本书旨在帮助读者逐步掌握C#编程的基础...
13.javadoc.hpi 14.workflow-api.hpi 15.script-security.hpi 16.junit.hpi 17.maven-plugin.hpi 18.git-client.hpi 19.matrix-project.hpi 2.workflow-step-api.hpi 20.git.hpi 3.credentials.hpi 4.scm...
《天嵌科技出品-Linux移植之Step By Step_V4.5_20100605》是一份详尽的教程,旨在指导用户如何在天嵌科技的TQ2410平台上进行Linux系统的移植工作。TQ2410是一款基于Samsung ARM9处理器的嵌入式开发板,广泛应用于...
Step3:提交到远程仓库,通过 `git push` 命令将代码提交到远程仓库。 6. Git 的本地仓库和暂存区 Git 的本地仓库和暂存区是 Git 的两个重要概念,本地仓库用于存储代码的历史版本,而暂存区用于暂存代码的变更。 ...