zoukankan      html  css  js  c++  java
  • Git-原理相关归纳-非入门

    题记-知道的越多,不知道的也越多

    曾经以为自己对 Git 的使用还蛮熟练的了,尽管具体原理不清楚,但可以应付大多数情况,至少比大部分人都熟了。直到有一次在处理分支合并时,发现合并后丢失了一些提交。于是只能试着回滚导致丢失的合并,但是在回滚合并时,居然有不同的父节点可以选择。
    这个时候我意识到,还差得远呢。知道的越多,不知道的也越多。


    如何存储基本对象

    对象

    四种 Git Object 对象存放在 .git/objects 中:blob,tree,commit,tag。
    blob:存储单个完整的文件内容。
    tree:存储一个目录结构,包含目录下每个文件的权限、类型、SHA1以及文件名(文件blob、子目录tree)。
    commit:存储根目录 tree 的 SHA1,父节点 commit 的 SHA1,此次提交的作者,时间和备注。

    分区

    三个分区:工作目录,Index 索引区域,Git仓库。
    工作目录:未暂存的改动文件。
    Index 索引区域:暂存区域,通过 add 加入,每个改动文件都会创建一个 blob 对象。
    Git 仓库:通过 commit 加入,创建多个 tree,一个commit对象,commit 指向根目录的 tree。


    问题和提示们

    1. 如果提交两个文件名不同,但是内容相同的文件,有几个 blob ?

    只有1个, blob 存储文件具体内容,并根据内容生成 SHA1 ,再以 SHA1 命名文件,也因此他们的文件名必然会是一样的。就跟字典似的。

    2. Git 每次提交存储的是文件的改动部分,还是整个文件内容?

    是整个文件内容,也因此 Git 在拉取更新时,只要找到对应的一个 blob 即可,不需要再不断往前查找所有改动。

    3. 只要 add 过,那就会创建 blob,意味着就可以还原!所以,经常 add 吧!(磁盘空间不要钱吗?!)

    4. 一次 commit 到底包含了什么东西?

    每一个发生变动文件对应的 blob 对象,所有受到影响的目录以及父目录的 tree 对象,记录此次提交指向的新 tree 、一个父提交以及提交信息的 commit 对象。


    参考

    这才是真正的GIT——GIT内部原理
    GIT第五讲BLOB、Commit和Tree组件
    git的深入浅出-3、.git文件下的剖析和commit、blob、tree对象之间的关系和基本操作和暂存区、工作区的使用

  • 相关阅读:
    python split的用法
    大学排名爬虫
    一直在报错:ModuleNotFoundError: No module named 'bs4'.
    微信小程序部署到线上环境
    mybatis关联三张表查询对应字段名
    WPF图像裁剪控件
    git创建标签并推送到远程
    Windows7、10的热键屏蔽
    WPF使用SVG简单整理
    Visual Studio 注册码和下载
  • 原文地址:https://www.cnblogs.com/nickcan/p/14678306.html
Copyright © 2011-2022 走看看