zoukankan      html  css  js  c++  java
  • 深入理解Git

    前篇:
    深入理解Git - 一切皆commit

    如何从稍微底层一点的角度,从底层实现理解一切皆commit ?

    配合希沃白板课件食用,效果更佳:
    【希沃白板5】课件分享 : 《Git 进阶 - 从使用角度深入理解Git》
    https://r302.cc/ke8XdO?platform=enpc&channel=copylink
    点击链接直接预览课件

    git 文件系统

    git 本质上是一个基于键值对的文件系统。
    文件系统,最重要的两个内容,当然就是 文件 和 文件夹 了。

    blob object(数据对象)

    git 中的 blob object 就是文件系统中的文件,包含 键:一个 hash 值和校验值的组合,值:文件内容。

    比较特殊的是:blob object 只存内容,不存文件名,文件名在 tree object 中保存。

    tree object (树对象)

    相当于文件系统中的文件夹。

    commit object(提交对象)

    提交对象可以理解为对树对象的一层封装,里面包含了提交时间,提交作者等信息,更重要的,里面包含了父提交的ID,由此就可以形成 git 提交的有向无环图。


    git 的这些对象的数据,保存在 .git/objects 目录下。

    这里,我们并没有发现分支这些概念,回顾之前说的『一切皆 commit』的理解,分支这些,不过是某个 commit 的引用。(都是纸老虎)

    案例

    将 t/bugfix 分支重置到 a1b2c3 提交。

    可以使用熟悉的 reset 命令: (@t/bugfix)git reset --hard a1b2c3,也可以用更底层的命令:git update-ref refs/head/t/bugfix a1b2c3

    效果是一样的,当然,平时使用,只推荐前者,这里只是作为对“分支是某个commit的引用”这句话理解的一个案例。

    标签对象

    tag object(标签对象)

    标签对象:指向一个特定对象的固定引用对象;
    可以给 git 中的任意对象打标签;

    标签对象不是引用(与分支名不同),是一种独立的git对象。但在使用上(针对提交的tag),体验一致。所以“一切皆commit”这句话,对标签而言,是不一定正确的,但实际使用中,一般只会给提交打标签。


    所有的引用,都记录在 .git efs 文件夹中。

    压缩与增量存储

    在没有压缩时,称 git 的存储模式为松散的对象模式,即一个文件的不同版本,都是保存其全部的数据。在 git gc 时,会压缩并实现增量存储。这个命令在执行 pull 等命令时自动触发。

    为什么 git 彻底删除大文件要修改整个历史?

    因为提交的不可变性,如图,如果 newfile 是个大文件,即使删除,在提交历史中依然存在。要彻底删除,就要重写 second 提交以及之后的每一个提交,因为之后的提交都有 tree 指向这个大文件,即使删除,提交的父提交也需要变化。

    1. 彻底清除 newfile 之后,second 提交将无效,需要生成一个新提交,second' ;
    2. three 提交的 tree 引用中,也需要删除 new.cs 的引用,同时修改父提交为 second' ,生成新提交为 three' ;
    3. 对于 forth 提交,不用清理 tree 对象,但也需要将父提交修改为 three',得到新的提交 forth' ;
    4. 以此类推,后面的每一个提交都需要修改;

    勘误:这里的 three,应该是 third 。图片中也写错了,就懒得改了。


    原文连接:https://www.cnblogs.com/jasongrass/p/10582465.html

    END

  • 相关阅读:
    当重写的父类的返回值类型是子类的返回值类型的父类的时候返回值类型就可以不同 比如父类的返回值是Object 子类的返回值类型是String 同意吗?
    当重写的父类的返回值类型是子类的返回值类型的父类的时候返回值类型就可以不同 比如父类的返回值是Object 子类的返回值类型是String 同意吗
    重写后的方法与被重写的方法的返回值一样吗?
    java中,一个类实现某个接口,必须重写接口中的所有方法吗
    java方法重写返回值类型
    field
    JAVA父类引用指向子类的对象意思
    io模型
    操作系统面试题整理
    java并发问题
  • 原文地址:https://www.cnblogs.com/jasongrass/p/10582465.html
Copyright © 2011-2022 走看看