Git基础知识(五)

2019-07-19 14:26:40 浏览数 (1)

分支

都说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这个文件夹,发现

代码语言:javascript复制
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基础的数据存放方式,分支的创建,当前状态的查看。

0 人点赞