10.3 Git Internals - Git References(看书笔记)

Git References

  1. 上一章中创建啦三个commit对象,可以通过git log 1a410e来查看所有的commit信息,因为1a410e是最后一个commit对象的SHA-1值。
    但是,我们不可能去记忆一串SHA-1值,Git中用references(也叫refs),使用一个简单名名字来存储SHA-1值,我们查看commit只需要记忆那个名字就可以。
  2. 这些references文件存储在.git/refs目录下
  3. 代码说话
/*
依次执行下面的命令
*/
//---------------------------------------------------------------------------------
/*
查找.git/refs文件夹下的文件,目前还没有创建过任何`references`,所以只有两个文件夹,分别是heads和tags
*/
$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/tags
/*
并没有任何文件,find没有输出任何结果
*/
$ find .git/refs -type f
//---------------------------------------------------------------------------------
/*
在.git/refs/heads/文件夹下创建master文件并输入上一章节中新建的最后一个commit object的SHA-1值。
这就完成啦一个`Git reference`的创建
*/
$ echo "1a410efbd13591db07496601ebc7a059dd55cfe9" > .git/refs/heads/master
/*
用新建的名为master的`Git reference`来查看commit信息
git log就是查看commit历史的命令
*/
$ git log --pretty=oneline master
/*
正确输出啦 first 到 third 三个commit
*/
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
//---------------------------------------------------------------------------------
/*
一般不鼓励用户直接更改`Git reference`文件
Git提供啦更加安全的命令`update-ref`
两个参数,分别是文件相对路径,以及要存储的commit的SHA-1值
这个master基本上就是一个Git的branch啦,一个branch就是简单的一个指针,
指向某个工作路线的头部。
*/
$ git update-ref refs/heads/master 1a410efbd13591db07496601ebc7a059dd55cfe9
/*
另外再新建一个名为test的branch,指向‘second commit’那个commit obejct
*/
$ git update-ref refs/heads/test cac0ca
/*
branch只包含指向的那个commit object之前的commit历史,不会包含之后的
用git log看test这个branch的commit历史,只有first 到 second两个commit
*/
$ git log --pretty=oneline test
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
图一:添加两个branch后整个git仓库的结构图
  • 从上面的操作中得到啥啦?
    1. git的branch其实就是.git/refs/heads文件夹下的git references文件,这种文件里只存储啦一个commit objectSHA-1值。
    2. 推荐使用git update-ref来更改git references文件,而不是直接修改。
    3. 当运行git branch (branchname)这个命令时,其实就相当于使用调用git update-ref,新建名为"branchname"的文件,将当前所在branch的最后一个commitSHA-1值存储到该文件中。这就创建完成啦一个名为“branchname”的branch。
  • Q----------A
    1. Q:branch文件中存储啦什么?
      A:branch文件中只存储啦commit object的SHA-1值。

The HEAD

  1. HEAD是一个象征性引用的文件,它告诉Git用户当前正在进行操作的branch是哪个。为什么是象征性引用文件,因为HEAD文件中并不直接存储commit的"SHA-1"值(上面讲的branch文件是直接存储啦commit的SHA-1值),HEAD是一个指向另一个引用的指针。
  2. 代码说话
/*
依次执行下面的命令
*/
//---------------------------------------------------------------------------------
/*
用cat命令查看".git/HEAD"文件的内容
*/
$ cat .git/HEAD
/*
可以看到文件中存储啦当前所在branch(master)的文件路径。
*/
ref: refs/heads/master
/*
用git checkout 切换branch到test branch
*/
$ git checkout test
/*
再次用cat命令查看".git/HEAD"文件的内容
*/
$ cat .git/HEAD
/*
可以看到此时,HEAD文件的引用内容已经变成啦refs/heads/test啦
*/
ref: refs/heads/test
/*
如果用git commit进行commit操作,会新建commit object,
并使用当前HEAD文件中指向的那个branch文件中指向的那个commit object作为parent*/
$ git commit
//---------------------------------------------------------------------------------
/*
我们可以直接手动修改HEAD文件,不过Git提供啦更加安全的“git symbolic-ref”
这个命令也可以直接查看HEAD的内容
*/
$ git symbolic-ref HEAD
/*
显示结果,指向master branch
*/
refs/heads/master
/*
用git symbolic-ref 命令设置HEAD文件内容为“refs/heads/test”
*/
$ git symbolic-ref HEAD refs/heads/test
/*
用cat命令查看HEAD,输出结果显示内容已经变成ref: refs/heads/test
*/
$ cat .git/HEAD
ref: refs/heads/test
/*
如果设置的格式不对,指向啦refs文件夹外的文件,就会警告。所以这个命令更安全嘛。
*/
$ git symbolic-ref HEAD test
fatal: Refusing to point HEAD outside of refs/

Tags

  1. Tag ObjectCommit Object有点像,Tag存储啦tagger(标记者),date(时间), message(存储信息),a pointer(一个指针),这根Commit Object很像。不同的是,tag像branch一样,指向一个commit object,而不像Commit Object一样指向一个tree
  2. 代码说话
/*
依次执行下面的命令
*/
//---------------------------------------------------------------------------------
/*
使用git update-ref 命令,在refs/tags文件夹中添加tag文件,名为v1.0
这是一个lightweight tag,只存储啦指向的那个commit object的SHA-1值
输入的是上面图一中的(second commit)的SHA-1值
*/
$ git update-ref refs/tags/v1.0 cac0cab538b970a37ea1e769cbbde608743bc96d
//---------------------------------------------------------------------------------
/*
使用 git tag 命令,创建一个名为v1.1的tag,但是加上 -a选项,这是一个annotated tag
后面是图一中的(third commit)的SHA-1值,
-m选项添加“test tag”为信息
*/
$ git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 -m 'test tag'
/*
用cat命令查看刚刚创建的v1.1这个tag文件的内容
*/
$ cat .git/refs/tags/v1.1
/*
从输出结果可以看到,(annotated tag)的tag文件保存的不是刚刚输入的(commit object)的SHA-1值
annotated tag与lightweight tag最主要的不同就是
1.lightweight tag的文件直接保存指向的那个commit object的SHA-1值
2.annotated tag创建时,会创建一个(tag object),
而tag文件通过(tag object)的SHA-1值指向改(tag object),
再由(tag object)中存储的SHA-1指向(commit object)。
所以,
这个值是新创建的(tag object)的SHA-1值。
*/
9585191f37f7b0fb9444f35a9bf50de191beadc2
/*
用git cat-file命令查看(tag object)的内容
*/
$ git cat-file -p 9585191f37f7b0fb9444f35a9bf50de191beadc2
/*
object条目存储的就是创建tag时传入的那个(commit object)的SHA-1值
还有type tag tagger(标记者) 等信息
最后一行是Message
*/
object 1a410efbd13591db07496601ebc7a059dd55cfe9
type commit
tag v1.1
tagger Scott Chacon <schacon@gmail.com> Sat May 23 16:48:58 2009 -0700
//
test tag
/*
用-t参数看,文件的类型为tag
*/
$ git cat-file -t 9585191f37f7b0fb9444f35a9bf50de191beadc2
tag
//---------------------------------------------------------------------------------
/*
tag可以指向任何(git object)
假设仓库管理者把(GPG公钥)存储为一个(blob object)将,并用tag标记啦这个blob,
那么可以用(git cat-file)命令来查看那个公钥,因为存储为blob,所以第二个参数是blob
QAQA: 
Q:命令中的junio-gpg-pub是tag名称吗?
Q :我试着用tag去指向别的blob文件,确实可以,但是下面的命令没用啊QAQA
*/
$ git cat-file blob junio-gpg-pub
  • 得到的结论
    1. (自己是试啦,可以指向别的object,以后再说吧QAQA)tag不仅仅可以指向一个commit object,tag可以指向任何一个Git Object,包括tree object blob object commit object

Remotes

  1. 同样是在.git/refs文件夹下,Remotes是第三种引用啦。每次你使用push将本地的branch推送到服务器上时,Git都会在.git/refs/remotes文件夹下进行记录。
  2. 还是代码说话
/*
依次执行下面的命令
*/
//---------------------------------------------------------------------------------
/*
使用git remote add命令添加一个名为origin的remote
QAQA:
Q:我想知道添加一个remote,会操作哪些文件?
*/
$ git remote add origin git@github.com:schacon/simplegit-progit.git
/*
将本地的branch推送到remote
*/
$ git push origin master
/*
输出一系列结果信息,最后一行是本地和远程两端的branch的SHA-1值
*/
Counting objects: 11, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 716 bytes, done.
Total 7 (delta 2), reused 4 (delta 1)
To git@github.com:schacon/simplegit-progit.git
/*
QAQA:
Q:为什么两个SHA-1值不一样?
*/
  a11bef0..ca82a6d  master -> master
//---------------------------------------------------------------------------------
/*
通过查看.git/refs/remotes/origin文件夹的master文件,
就可以知道上次与服务器通讯时,推送的是哪个commit object啦。
QAQA:
Q:这里不怎么明白啊,得实际尝试过
*/
$ cat .git/refs/remotes/origin/master
ca82a6dff817ec66f44342007202690a93763949
  • QAQA:
    Q: 关于Remote有很多没看懂啊,得用过github才行啊。
    Remote references differ from branches (refs/heads references) mainly in that they’re considered read-only. You can git checkout to one, but Git won’t point HEAD at one, so you’ll never update it with a commit command. Git manages them as bookmarks to the last known state of where those branches were on those servers.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容