首页 Git-Learn
文章
取消

Git-Learn

Git-Learn

文件系统

  1. 工作区(本地文件):指的是项目代码存放的文件位置。
  2. 暂存区:通过git add. 将代码存放到“暂存区”,使得git能追踪到修改记录。
  3. 本地库:git commit -m “xx” 将暂存区中的代码提交到“本地仓库“,生成一个本地版本。注意版本内容不可用通过Git指令修改与删除。
  4. 远程库:git push将本地仓库推送到远程仓库。
  5. 暂存区与本地仓库并不是实际存在代码仓库,即代码量并不会增加,只是将每行代码的操作与内容进行索引标记,从而实现版本控制

存储原理

  1. 计算文件校验值 Git通过SHA-1(一种散列算法,将任意的二进制数据转化为40个十六进制数组组成的哈希值),为文件的唯一校验值,例如:ffb60d67c2076b21653afe7ff04f43d77ccdd620
  2. 文件的校验值前2位作为文件的目录,后38位作为文件名,存储到相应文件位置。
    1-pages

存储过程

  1. 在任意文件下,新建Test文件。利用vscode(需要在vscode下配置git指令)打开当前空文件夹,git init初始化一个本地.git仓库。
    2-pages
  2. 新建一个A.md文件,在文本中输入hello world!使用git add A.md加入到暂存区中。通过git hash-object A.md确定生成的hash值。
    3-pages
  3. 可以在文件bojects下发现存在相应的文件目录与文件。同时执行git cat-file -p bc7774a7b18deb1d7bd0212d34246a9b1260ae17会执行该文件,输出hello world! 4-pages
  4. 上述的操作完成了一个文件的存储即我们称之为blob对象。而blob对象存储的只是文件的内容,但并未存储文件名称。因此我们需要另一种类型的对象,来保存文件名与文件之间的关联关系,形成一种树状结构。
  5. Tree对象本身无法通过git add 直接添加,而是由git系统自动生成,用于维护blob对象,即普通文件。在本地创建一个test文件夹,并创建B.md文档。
    5-pages
  6. 通过git commit -m “first commit” 产生一下的文件。产生了一个新版本,且生成如下的文件结构。其中af为提交对象的哈希值,执行该问价产生了根目录80的哈希值且为Tree结构。同时执行该哈希值,产生的是该目录下test目录aa与A.md文件bc的hash值为Tree与blob对象类型。即最后c5为B.md文件的hash值。
    6-pages
    7-pages
    8-pages
  7. 总结:git通过tree对象来存储目录层级关系及文件校验值,通过文件校验值来访问blob对象,再通过blob对象存储文件内容。

提交与分支

  1. 通过上诉的操作,我们可以了解到相关概念即 blob对象->实际文件内容 Tree对象->文件目录 提交对象->包含提交人、父提交对象地址、提交信息等内容还包含一个Tree对象。且该对象为项目的梗目录对象,可以根据该根目录逐级获取到各个文件的校验值地址,获取到所有的文件。
  2. 通过checkout – b 指令创建一个test2分支,且查询相关信息。打开refs下heads文件发现两个分支的hsah值相同,因为test2分支保存的上一次commit的提交对象。故可理解为每个分支中的hsah值均是再当前分支下最新的commit 提交对象。
  3. 总结:分支对象只是一个引用,一个指针,通过校验值指向某个提交对象。在git中,创建任何分支几乎没有任何代价,只是创建了一个40字节的文件,这位Git的灵活的分支机制提供了基础。
    9-pages

常见指令

git init 初始化本地库,即创建一个文件使得该文件成为本地仓库
git status查询当前仓库状态
git add . 将修改的代码放到暂存区,且可以使用
git restore –staged将暂存区的代码删除掉
git commit -m 切记每次commit 到本地仓库,为一个版本。

本文由作者按照 CC BY 4.0 进行授权

Iphone 美区账号免费获取

秒速五厘米-樱花抄