zoukankan      html  css  js  c++  java
  • 【git】git的内部原理

    参考文章:https://zhuanlan.zhihu.com/p/96631135

    参考文章:https://marklodato.github.io/visual-git-guide/index-zh-cn.html

    PART 1 git内部存储信息的方式

    在.git/objects里面有几种objects

    blob: 节点,只储存文件内容,不包含文件名信息,在add之后就会存在,对象文件名是SHA值。

    tree: 树,当前目录结构的快照,每一个文件 / 文件夹 的 权限 / 类型 / SHA值 / 文件名。

    commit: 提交,tree的SHA值,上一个提交的SHA值,提交的作者和具体时间,提交的信息

    分支信息位置

    cat .git/HEAD

    cat .git/refs/heads/master 会指向一个提交对象

    PART 2 三个分区如何变更

    三分区:

    工作目录: working deriectory: 操作系统上的文件

    索引 / 暂存区:Index / stage: 存着一个索引,这个索引可以认为是一个tree,而储存下来的tree对象是该索引的快照。在.git/index 文件中保存。

    仓库:repository: 记录每一次提交

    之间相互转换的关系:

     

    git add:建立blob对象,更新索引(将文件指向新的对象)

    git commit: 根据当前索引生成一个tree对象,创建一个新的commit对象,由之前的commit对象生成,组成一条变更历史。

    Q & A

    Q:git储存的是文件快照还是变更部分?

    A:文件快照。哪怕修改一点也是全新的一个blob。checkout commit很方便,

      另外git还有垃圾回收机制,会清楚无用的object, 还会把相似的打包压缩。

    Q:git checkout到底是啥意思?

    A:有两种用法:

      git checkout sth: 切换分支,把HEAD指向某个commit对象,这个commit对象可以是SHA值确定的,也可以是分支确定的,

      eg.  git checkout HEAD^ 切换到当前HEAD的上一个提交

        git checkout 244006 切换到SHA为244006的commit对象

        git checkout master 切换到master分支对应的提交

      git checkout sth somefile: 并不切换HEAD的指向,而只是把某个文件恢复到某个状态。

    Q:git reset是啥意思?

    A:将当前的分支指向另一个提交。

  • 相关阅读:
    string 流
    文件输入和输出
    IO类
    算法
    MySQL常用处理方法
    linux curl工具
    设计模式
    C语言编程流程
    js escape 与php escape
    js undefined易错分析
  • 原文地址:https://www.cnblogs.com/yesuuu/p/12057379.html
Copyright © 2011-2022 走看看