Git-Learn
文件系统
- 工作区(本地文件):指的是项目代码存放的文件位置。
- 暂存区:通过
git add.
将代码存放到“暂存区”,使得git能追踪到修改记录。 - 本地库:
git commit -m “xx”
将暂存区中的代码提交到“本地仓库“,生成一个本地版本。注意版本内容不可用通过Git指令修改与删除。 - 远程库:
git push
将本地仓库推送到远程仓库。 - 暂存区与本地仓库并不是实际存在代码仓库,即代码量并不会增加,只是将每行代码的操作与内容进行索引标记,从而实现版本控制
存储原理
- 计算文件校验值 Git通过SHA-1(一种散列算法,将任意的二进制数据转化为40个十六进制数组组成的哈希值),为文件的唯一校验值,例如:ffb60d67c2076b21653afe7ff04f43d77ccdd620
- 文件的校验值前2位作为文件的目录,后38位作为文件名,存储到相应文件位置。
存储过程
- 在任意文件下,新建Test文件。利用vscode(需要在vscode下配置git指令)打开当前空文件夹,
git init
初始化一个本地.git仓库。
- 新建一个A.md文件,在文本中输入hello world!使用
git add A.md
加入到暂存区中。通过git hash-object A.md
确定生成的hash值。
- 可以在文件bojects下发现存在相应的文件目录与文件。同时执行
git cat-file -p
bc7774a7b18deb1d7bd0212d34246a9b1260ae17会执行该文件,输出hello world! - 上述的操作完成了一个文件的存储即我们称之为blob对象。而blob对象存储的只是文件的内容,但并未存储文件名称。因此我们需要另一种类型的对象,来保存文件名与文件之间的关联关系,形成一种树状结构。
- Tree对象本身无法通过git add 直接添加,而是由git系统自动生成,用于维护blob对象,即普通文件。在本地创建一个test文件夹,并创建B.md文档。
- 通过
git commit -m “first commit”
产生一下的文件。产生了一个新版本,且生成如下的文件结构。其中af为提交对象的哈希值,执行该问价产生了根目录80的哈希值且为Tree结构。同时执行该哈希值,产生的是该目录下test目录aa与A.md文件bc的hash值为Tree与blob对象类型。即最后c5为B.md文件的hash值。
- 总结:git通过tree对象来存储目录层级关系及文件校验值,通过文件校验值来访问blob对象,再通过blob对象存储文件内容。
提交与分支
- 通过上诉的操作,我们可以了解到相关概念即 blob对象->实际文件内容 Tree对象->文件目录 提交对象->包含提交人、父提交对象地址、提交信息等内容还包含一个Tree对象。且该对象为项目的梗目录对象,可以根据该根目录逐级获取到各个文件的校验值地址,获取到所有的文件。
- 通过
checkout – b
指令创建一个test2分支,且查询相关信息。打开refs下heads文件发现两个分支的hsah值相同,因为test2分支保存的上一次commit的提交对象。故可理解为每个分支中的hsah值均是再当前分支下最新的commit 提交对象。 - 总结:分支对象只是一个引用,一个指针,通过校验值指向某个提交对象。在git中,创建任何分支几乎没有任何代价,只是创建了一个40字节的文件,这位Git的灵活的分支机制提供了基础。
常见指令
git init
初始化本地库,即创建一个文件使得该文件成为本地仓库
git status
查询当前仓库状态
git add .
将修改的代码放到暂存区,且可以使用
git restore –staged
将暂存区的代码删除掉
git commit -m
切记每次commit 到本地仓库,为一个版本。