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基础的数据存放方式,分支的创建,当前状态的查看。