Git英文名词参考

前言

使用git的时候,直接查看官方手册比上网搜索来的快,也更加准确靠谱,但有手册有很多术语不了解,所以我整理了一下,下面是对它们的解释,想深入学习的同学不妨看看

git里的object

首先了解下git组织和存储文件的方式,对于后面的阅读会有帮助。

blob是什么?

它是被压缩的文件file(我们存储在仓库里的文件代码等就是file),压缩内容包含了file的类型、大小、内容,压缩后的blob无法看出原来file的前面提到的各种信息(除非将其解压),存储在git的object数据库里,所以使用tree来记录路径/文件名、文件权限,可以将tree当作一个目录结构.
参考资料 https://initialcommit.com/blog/what-is-a-blob-in-git
为什么要把文件压缩成blob?
压缩前git会计算出文件的SHA-1 hash值,相当于ID。如果commit后某个文件没有被修改,计算出来的SHA-1值是一样的,那么git就不需要存储这些重复的文件,只需要保留原来的那一个blob,大大减少了存储消耗。

tree是什么?

tree用于记录blob的路径/名字、权限以及SHA-1值,存放在.git/objects/里。一个tree可以记录多个blob,每一次commit都会产生一个新的tree,是一个仓库快照。tree被压缩后存储在object数据库里。
不要把tree object和working tree混淆,working tree指的是你checkout后的各种目录文件的结构。

暂存区,工作区

index, cache, stage

index、cache、stage均指暂存区。这几个词总是被交替使用,但它们指的是同一个东西。
index文件存放在.git/index里,里面包含了各个blob的信息。内容格式为:

...	#index文件前面还有一些其他内容,如header
<file-1-mode> <file-1-blob-hash> <file-1-stage-number> <file-1-path/name>
<file-2-mode> <file-2-blob-hash> <file-2-stage-number> <file-2-path/name>
...

对于暂存区我之前有一个思想误区,通过实例看一下,现在我们将一个文件a添加到暂存区

$ git status	#初始status
On branch master
nothing to commit, working tree clean
$ echo Hello World > a	#修改文件 a
$ git status	#修改a后还没有 add a 的status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   a

no changes added to commit (use "git add" and/or "git commit -a")
$ git add a		#执行 add a
$ git status	#修改a后add a 后的status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   a

现在我们看到add a前git status提示工作区文件a被修改了,但还没被添加到暂存区;add a后git status提示暂存区文件有一个被修改的文件a还没被提交到版本库。
你会不会有这样的想法:暂存区一开始是空的,add后才有了文件a,commit的时候只将暂存区里的a提交到版本库
实际上这种认知是错误的,先看下面的操作

$ git status				#初始status
On branch master
nothing to commit, working tree clean
$ git ls-files --stage		#初始index文件
100644 5ab5506065a2c15f240e6ab012cf667e4ce5c8b9 0       a
100644 c1384c7dca8610fc61b99202da30cb7b52b14da4 0       b
$ echo do some change > a	#对a文件做一些修改
$ git add a					#add a
$ git ls-files --stage		#add a后的index文件
100644 836356ef3df0599a9603af9aae938aa66021da57 0       a
100644 c1384c7dca8610fc61b99202da30cb7b52b14da4 0       b

git ls-files --stage命令用于查看index文件的内容
在还没修改文件a的时候我们查看index文件内容,可以看到有a和b两个文件;修改a后再将其添加到暂存区,再次查看index文件,注意比较下a前后两条记录的区别,初始index文件存在a和b两条记录是因为我已经把a和b提交到了版本库
或许你已经清楚了,暂存区除了记录你在工作区add的文件,还记录了你最新一次提交(commit)时所有文件的信息。更确切地说,index文件一开始保留了最新一次commit时版本库所有blob的信息,而在你add file后,git为file生成了新的blob,再更新了index文件。所以,除非你的版本库是空的并且还没有add文件,index文件,对应的也就是暂存区,不是空的,git status只是列出了暂存区的变化
纠正了这个错误的认知,也就能理解git rm --cached <file> 为什么会出现下面的状况

$ git status				#初始status
On branch master
nothing to commit, working tree clean
$ git ls-files --stage		#初始index文件
100644 5ab5506065a2c15f240e6ab012cf667e4ce5c8b9 0       a
100644 c1384c7dca8610fc61b99202da30cb7b52b14da4 0       b
$ git rm --cached a			#删除暂存区文件a
rm 'a'
$ git ls-files --stage		#删除后index文件
100644 c1384c7dca8610fc61b99202da30cb7b52b14da4 0       b
$ git status				#删除后status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    a

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        a

参考链接 https://mincong.io/2018/04/28/git-index/

working tree

直译为工作树,指的是工作区。更准确的理解请参考tree

ref是什么?

ref全称reference,它像是一个变量名,也可以理解成指针,指向一个commit ID、分支名或者tag,像HEAD、master就是ref
参考链接 https://initialcommit.com/blog/what-is-git-head#git-refs-and-heads

detached HEAD

参考资料

Git: git-filter-branch 手册
Git: git-filter-repo 手册
Git: Understanding the Index File https://mincong.io/2018/04/28/git-index/
《Decoding Git Guidebook for Developers》https://initialcommit.com/blog/Learn-Git-Guidebook-For-Developers-Chapter-1
该网站提供了书里一部分内容,介绍git历史,blob还有关于tree, commit等object,挺不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值