Git基础知识(五)
分支
都说Git的分支是它的必杀技特性,由于没有接触过太多的版本管理工具,就使用过的SVN来说,两者真的差别巨大。SVN创建一个分支,需要将内容复制一遍!这个时间真的是非常的漫长,而Git只需要几秒钟。所以Git鼓励在工作流中频繁的使用分支和合并。
Git保存数据的方式
Git保存的不是文件的变化或者差异,而是不同时刻的文件快照。
Git每次进行提交操作的时候,会保存一个提交对象:这个提交对象包含了一个指向暂存内容快照的指针,并且这个对象还包含了作者的姓名,邮箱,提交信息,指向它的父对象的指针。
- 首次提交产生的提交对象
没有父对象 - 普通提交操作产生的提交对象
有一个父对象 - 多个分支合并产生的提交对象
有多个父对象 举一个例子:
在一个空的文件夹中创建Git仓库,新建三个文件并完成提交。
1 | git add README test.rb LICENSE |

首先先来查看一下当前的状态
然后进入cd .git/objects/进到git存放对象的地方

使用ls -al可以看到这些个东西都是文件夹「d开头」
感兴趣可以了解更多Linux文件属性的知识:

刚才通过git log看到的哈希值为:e011573e4a35dda973b7cdadd8ef5954cfa8314f,所以进入e0这个文件夹,发现
1 | e0文件夹 |

所以这个对象就是提交对象。
查看Git的对象
由于这个提交也就是当前位置,所以可以直接使用拿到这一段内容
1 | cat .git/HEAD |

这些文件的内容其实是压缩的数据外加一个标注类型和长度的头.
类型可以是
- 块(blob)
- 树(tree)
- 提交(commit)
- 标签(tag)
使用git cat-file -t <SHA值>可以看到它的类型



使用git cat-file commit <SHA值>可以看到提交信息

使用git ls-tree <SHA值>可以看到树的信息,我们在这棵树里面看到了我们刚新建的三个文件

使用git cat-file blob <SHA值>可以看到文件的内容,不过可惜我这次的提交是空文件。
我对文件进行修改之后再进行了一次提交,然后再查看blob的时候可以看到和我新增的修改一样


在修改之后,指针就会指向新的提交

创建分支
我们要创建一个分支,就相当于要创建一个可以移动的新指针。
使用的是git branch <name>

虽然我们创建了一个分支,但其实我们还是在master上,我们当前的位置其实是由HEAD这个特殊的指针决定的。
切换分支
1 | git checkout testing |

我们可以在这个分支上进行后续的提交

假设我们回到master分支上进行一个提交

我们就可以发现两个分支往不同的方向走去了
使用git log --oneline --decorate --graph --all ,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。
也可以用git log --graph --all查看分支图的详细信息

不加上--all的话只会显示当前所在分支的内容

以上就学会了Git基础的数据存放方式,分支的创建,当前状态的查看。