Git tutor
in MIT Missing Semester
说明:
英文 | 中文 |
---|---|
bolb | 文件 |
tree | 树 |
commit | 提交/历史版本 |
object | 文件 |
文件本身是一个字符串,另外具有其名字;通过文件,递归地定义树:
我们可以将树理解为“文件或文件夹”。其中,最高层级的被跟踪版本信息的树,称为commit。
blob/tree/commit实际上都是磁盘上的一个区域,我们将之全部抽象为对象object。三者在此完成统一。
对象查找利用的是哈希寻址,利用Git的哈希函数SHA1-hash构造出长长的一个id字符串,是十六进制内存地址,也即指针;id太长人记不住,于是截取为引用ref。objects是从id到object的键值对。
实际上,从树开始,整个数据结构是层层抽象,是指针。
文中的伪代码对Git作出了十分简洁明确的说明。鉴于本人语言表达不好,对之进行注释更便于理解。
xxxxxxxxxx
451// 文件是字符串
2type blob = array<byte>
3
4// 树是从文件名/文件夹名到子树或文件的映射
5// 即,一个文件夹有多少子文件夹/文件,从各自名称到实体的映射
6type tree = map<string, tree | blob>
7
8// 历史版本
9type commit = struct {
10parents: array<commit>//父版本
11author: string//作者名
12message: string//提交日志信息
13snapshot: tree//快照是树,最高层那个被跟踪的树
14}
15
16//对象是文件、树或历史版本,其实历史版本就相当于最高的树
17type object = blob | tree | commit
18
19//object是从id到object的键值对
20objects = map<string, object>
21
22def store(object)://函数,存储一个对象的信息
23id = sha1(object)//哈希函数构造id
24objects[id] = object
25
26def load(id)://按照id加载对象
27return objects[id]
28
29//引用是从name到id的映射
30references = map<string, string>
31
32//更新引用,即新对象新名字写入记录
33def update_reference(name, id):
34references[name] = id
35
36//读取名字对应的id
37def read_reference(name):
38return references[name]
39
40//按照已知信息加载
41def load_reference(name_or_id):
42if name_or_id in references://参量是name
43return load(references[name_or_id])
44else:
45return load(name_or_id)
根据以上说明,现在可以对Git仓库加以解释:仓库是数据对象和引用。
略。
略。
如下:
git stash
将暂存区(尚未提交)全部内容放入堆栈,可用以解决代码版本冲突(如,本地git stash
后,重新拉取远程库代码,然后git stash pop
将存入的内容出栈放回)。
git log --all --oneline
展示所有历史版本的引用ref和对应日志信息。略
略
略
2023.2