💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
第一部分: 三大工作区 ![](https://box.kancloud.cn/8c3c1876fb569ce9711fdc23f0ebb9e0_775x387.png) 版本库中的文件有三种状态: ----已修改: modified -----已暂存: staged -----已提交: commit 1)工作目录(工作区) 理解:1)该目录存放开发人员开发的代码文件 2)该目录里的代码文件,可以进行版本控制 3)该目录下有一个隐藏文件.git 2)暂存区 理解: 1)理解为一个虚拟工作区,这个虚拟工作区会跟踪工作区的文件变化 2)存储一个tree对象的所有信息的二进制文件,分别指向不同的blob、tree对象 3)我们修改的实际内容并没有保存到暂存区,在暂存区存放的是文件索引,该文件索引建立文件和版本库中对象之间的关联 3)版本库 理解: 工作目录下的.git文件夹就是版本库 版本库里的文件描述: ![](https://box.kancloud.cn/26547715baf6b11fe578f17d9942e46e_972x460.png) $ cat HEAD ref: refs/heads/new HEAD表示:指向当前分支最新一次提交 注意事项: 1)千万不要删除或更改版本库(.git)目录下的所有文件 2)新创建的文件,第一次没有被版本库追踪,使用gti status查看状态,会显示《untracked》 3)可以通过git add 命令把工作区里的文件,添加到暂存区 4)可以通过git commit命令把暂存区里文件,提交到当前版本库 可以简单理解为,将需要提交到版本库的的所有文件变更通通放到 暂存区,然后,一次性提交 暂存区 中的所有修改。 演示1: ![](https://box.kancloud.cn/6c53a9454628c69dae209995ebe4ed87_973x589.png) 演示2: ![](https://box.kancloud.cn/bda0ba6aece0d9a0e4764e388a14a3c4_939x629.png) 第二部分: 四个对象 (文件在git版本库里是如何存放的) 1、git 对象模型 1)git的每个对象在git版本里,用40个字符串来表示对象名, 2)字符串由对象内容做sha哈希计算得到 3)通过比较SHA的值确定两个文件内容是否发生改变 2、不同类型的对象用途 A:blob 存储文件数据,通常是一个文件 理解: 1)工作区里的每个文件,提交到版本库,是以二进制的形式存储的 2)blob对象,通过表示的是单个文件 3)通过git show SHA1查看blob里的内容 B:tree:存放一个目录,通过用来管理tree和blob(因为在一个目录里可以新建目录和文件) 理解: 1)tree对象像一个目录,用来管理“tree”和“blob”对象 2)一般用来表示内容之间的目录层次关系 C: commit: 指向一个tree,标记项某个特定时间点的状态,每执行一次git commit命令,就会生成一个commit对象 理解: 1)“commit”对象指向一个“tree对象” 2)标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、 3)有指向上次提交的指针,方便版本回退 D: tag: 用来标记某一个提交(commit) 理解: 1)tag对象也是指向某个特定的commit提交 2)我们一般情况下,会基于最近一次commit提交打一个tag标签,标志着一个版本发布(里程碑) ![](https://box.kancloud.cn/82f33d80e3d099fb1f24b2cc03abea2c_415x278.png) 演示: ![](https://box.kancloud.cn/1d93e80b25c4c757a0ab6059cd9eff0c_1119x641.png) 第三部分:二个引用 二个引用:分别为分支、标签 理解: 1)分支和标签实际上就是对commit对象提交的引用 2)引用存放路径: .git/refs $ ll total 0 drwxr-xr-x 1 Administrator 197121 0 一月 26 14:00 heads/ drwxr-xr-x 1 Administrator 197121 0 一月 26 11:20 tags/ heads目录:存放所有分支的指针 tags目录: 存放所有的标签 分支使用场景: 1) 比如多人开发一个项目,A程序员开发模块A,B程序员开发模块B,这个时候,每个人都会基于当前master分支,创建一个属于自己的分支出来,每次提交到自己的分支上,一定时期后,合并到master分支 2)比如当版本1.0发布后,然后又要开发一个功能,我们就会创建一个New分支出来。此时过了2天,发现之前的版本1.0有问题,我们最好的建议,回退到版本1.0,然后创建一个分支出来,专门用来修复bug,修复完毕后把这个bug合并到master分支,然后切换到New分支,把master分支上通过git rebase到new分支 标签(tag)的使用场景: 1)一般用来标记一个里程牌,一个程序版本的发布 2)程序发布的时候,可以基于tag来发布和回退 演示1: ![](https://box.kancloud.cn/c61ed80b82d247ebc6e3be7622bd07d2_948x554.png) 演示2:标签 (创建一个轻tag) Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git (GIT_DIR!) $ git tag v1.0 --创建一个版本 Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git (GIT_DIR!) $ cd refs/tags/ Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git/refs/tags (GIT_DIR!) $ ll total 1 -rw-r--r-- 1 Administrator 197121 41 一月 26 14:48 v1.0 Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git/refs/tags (GIT_DIR!) $ cat v1.0 27ec4bc2d21589316c58dcf2ecc9e30871b9878d (tag标签其实也是基于某一次commit提交来创建的) 演示3: ![](https://box.kancloud.cn/6b20f0dd91bfe1328335d7690b8a9c4a_972x583.png)