分支
都说Git的分支是它的必杀技特性
,由于没有接触过太多的版本管理工具,就使用过的SVN来说,两者真的差别巨大。SVN创建一个分支,需要将内容复制一遍!这个时间真的是非常的漫长,而Git只需要几秒钟。所以Git鼓励在工作流中频繁的使用分支和合并。
Git保存数据的方式
Git保存的不是文件的变化
或者差异
,而是不同时刻的文件快照
。
Git每次进行提交操作的时候,会保存一个提交对象
:这个提交对象包含了一个指向暂存内容快照的指针,并且这个对象还包含了作者的姓名
,邮箱
,提交信息
,指向它的父对象的指针
。
- 首次提交产生的提交对象
没有
父对象 - 普通提交操作产生的提交对象
有一个
父对象 - 多个分支合并产生的提交对象
有多个
父对象
举一个例子:
在一个空的文件夹中创建Git仓库,新建三个文件并完成提交。
代码语言:javascript复制git add README test.rb LICENSE
git commit -m 'The initial commit of my project'
例子
首先先来查看一下当前的状态
然后进入cd .git/objects/
进到git存放对象
的地方
查看当前状态
使用ls -al
可以看到这些个东西都是文件夹「d开头」
查看具体文件信息感兴趣可以了解更多Linux文件属性的知识:
Linux文件
刚才通过git log
看到的哈希值为:e011573e4a35dda973b7cdadd8ef5954cfa8314f
,所以进入e0
这个文件夹,发现
e0文件夹
内容:11573e4a35dda973b7cdadd8ef5954cfa8314f
组合:e011573e4a35dda973b7cdadd8ef5954cfa8314f
进入e0
所以这个对象就是提交对象。
查看Git的对象
由于这个提交也就是当前位置,所以可以直接使用拿到这一段内容
代码语言:javascript复制$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
e011573e4a35dda973b7cdadd8ef5954cfa8314f
image-20190404195709051
这些文件的内容其实是压缩的数据外加一个标注类型和长度的头.
类型可以是
- 块(blob)
- 树(tree)
- 提交(commit)
- 标签(tag)
使用git cat-file -t <SHA值>
可以看到它的类型
查看类型
tree
blob
使用git cat-file commit <SHA值>
可以看到提交信息
提交信息
使用git ls-tree <SHA值>
可以看到树的信息,我们在这棵树里面看到了我们刚新建的三个文件
树的信息
使用git cat-file blob <SHA值>
可以看到文件的内容,不过可惜我这次的提交是空文件。
我对文件进行修改之后再进行了一次提交,然后再查看blob的时候可以看到和我新增的修改一样
文件内容
首次提交对象及其树结构
在修改之后,指针就会指向新的提交
提交后指向
创建分支
我们要创建一个分支,就相当于要创建一个可以移动的新指针
。
使用的是git branch <name>
创建分支
虽然我们创建了一个分支,但其实我们还是在master上,我们当前的位置其实是由HEAD
这个特殊的指针决定的。
切换分支
代码语言:javascript复制$ git checkout testing
切换分支
我们可以在这个分支上进行后续的提交
分支上新增一个提交
假设我们回到master分支上进行一个提交
新建文件
我们就可以发现两个分支往不同的方向走去了
使用git log --oneline --decorate --graph --all
,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。
也可以用git log --graph --all
查看分支图的详细信息
分支图详细信息
不加上--all
的话只会显示当前所在分支的内容
当前分支的内容
以上就学会了Git基础的数据存放方式,分支的创建,当前状态的查看。