场景8
最后更新于:2022-04-01 06:26:55
* 猜一猜本场景中这个有趣的,我命名其为’主人公心路历程’的命令是什么吧? 答案是 **git reflog**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc6301efa.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc6333ac5.png)
场景7
最后更新于:2022-04-01 06:26:52
* 本场景命令: **git reset –hard HEAD~2**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc629fe05.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc62cd139.png)
* * *
场景6
最后更新于:2022-04-01 06:26:50
* 本场景命令: **git revert one-commit**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc625f6f3.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc627a793.png)
* * *
* 本场景中,相信git图已经很明确的告诉你这个命令的背后发生了什么
场景5
最后更新于:2022-04-01 06:26:48
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc621373d.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc623589a.png)
* * *
* 这次主人公要逃避现实了,他希望和xiaoli的那些happy time未曾发生,让我们回想一下第三次commit主要干了什么呢,对,主人公在第三次新增了一个events.txt,并写道’happy time with xiaoli’
* revet 本例中的第三次commit其实等同于 delet当时新增的event.txt文件,此时你发现问题来了,因为该文件后来有修改,此时revert会发生conflict,需要先修复,然后提交.revert会做一次新的提交.
场景4
最后更新于:2022-04-01 06:26:45
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc61bf86d.png)
* * *
* 主人公的恋爱状态仍然是”fall in love”,但是女主人公却换了,让我们一起来练习这次提交的git图
场景3
最后更新于:2022-04-01 06:26:43
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc61891ea.png)
* * *
* 只要一个文件不改变(包括内容和文件名),git就不会为该文件在下次提交时新建blob对象,而对于一个目录来所,只要它下面任意一个文件或子目录有变化git都将重新建一个commit对象
场景2
最后更新于:2022-04-01 06:26:41
* 本场景命令: **git add . **; **git commit -m “first commit”**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc60dcfc0.png)
* * *
* 那么在这些git对象和引用种到底存储了什么内容,他们怎样组织起来的呢???
* 如下图所示,引用HEAD文件中存的是当前branch的路径,默认为master
* 如下图所示,而分支master文件中存的是一个SHA-1值,该值是一个commit对象的key,意为分支master当前指向该特定commit
* 如下图所示,若找到对应master里存储的那个commit后我们看到该文件里存了若干信息,主要包括上一个commit对象的key,一些git对象的类型与key值,本次提交信息,提交者的信息与提交时间
* 如下图所示,一个tree对象里存储的是一个或多个blob 对象的key,对应到仓库里则意味着该目录下现在这几个文件
* 如下图所示,一个blob对象里存储的就是真实的文件内容啦
现在你能理解为什么主人公第一次commit后的git图如上所示了吧
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc610f9d9.png)
* * *
>
>
> Git 是一个内容寻址文件系统。 看起来很酷, 但这是什么意思呢? 这意味着,Git 的核心部分是一个简单的键值对数据库(key-value data store)。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc614e703.png)
* * *
* 第二次commit,主人公更改了status.txt的内容味’fall in love’,新增了girl_friend目录及name.txt文件
* 第二次git结构图如下所示,图中所示的git对象都存在于objects目录下,只是那些灰色的对象并不链在当前branch的当前状态上了
场景1
最后更新于:2022-04-01 06:26:39
* 本场景命令: **git init**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc6075a07.png)
* * *
* 在本场景中, 主人公新建了 `status.txt` 文件, `git add .` 后 objects 目录下多出一个文件,随后提交第一个commit,objects目录又多出两个文件.那么这多出的三个文件到底用来干什么呢???
* 其实这三个文件都是git对象,分别对应三种git数据模型 **blob**,**tree**,**commit**,其实还有第四种对象 **tag**.
* **blob** 对应我们仓库里的普通**文件**,当你将一份文件add到仓库里时,git将会为你产生一个blob对象存于objects目录下.
* **tree** 对应我们仓库里的一个**目录**,当你做一次commit时,git将会为你新增的目录产生tree对象存于objects目录下.
* **commit** 对应我们的一次**提交行为**,当你做一次commit时,git将会为你产生tree对象(若有新目录)的同时产生commit对象,存于objects目录下.
* 可以利用 `cat-file -t SHA-1-of-one-object` 查看一个对象的数据类型, SHA-1-of-one-object 的值为你看到一个objects下新增的文件的子目录+文件名
* 第一次提交后git的对象(blog,tree,commit)和引用(head,branch)间的关系组织如下图,图中已表明每一个对象和引用分别对应的事物
介绍
最后更新于:2022-04-01 06:26:36
> 原文出处:http://yanminx.com/blog/understand-git-by-drawing/
作者:[Yanmin](http://yanminx.com/)
这是我在项目组里讲过的一次git session,在此将所有slides添加讲解记录为博文.本文全文贯穿一个例子,先简单引进了git中的几个数据模型,然后通过画图方式帮助大家了解几个常用命令背后的行为.画图重心不涉及分支而是数据模型间的组织.
* 首先附上夺眼球的标题页和博文/session愿景
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc6007f4d.png)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-28_5680dc60270ce.png)
* * *
* 正式内容开始了,首先将介绍我们贯穿全文的例子背景 ( 总体来说就是用git记录,更新主人公的恋爱状态,当然是瞎编的 ), 例子将随着剧情的变化给出不同的场景,每个场景对应一个git命令.
* 在本地初始化一个空仓库 ( 本文例为 `mylove` 目录下), 进入 `.git` 目录下将看到git的目录结构,我们重点关注的将是 **objects** 目录,后边的图画中的git对象也大多存放于此.此时该目录下普通文件为空.