欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: jingsam

这篇文章本应该在6月份就完成,拖了4个月之后,终于兴起勇气捡起来,实在忸怩。僵持写文章就像长跑,途中跑起来根基是靠惯性,假如停下往返复跑就很累很坚苦。

闲话不多说,本篇继承承接前文讲一讲Git内部道理,本篇的主题是Git引用的道理。

首先来搞清楚什么是Git引用,前文讲了Git提交工具的哈希、存储道理,理论上我们只要知道该工具的hash值,就能往前推出整个提交汗青,譬喻:

$ git log --pretty=oneline 3ac728ac62f0a7b5ac201fd3ed1f69165df8be31
3ac728ac62f0a7b5ac201fd3ed1f69165df8be31 third commit
d4d2c6cffb408d978cb6f1eb6cfc70e977378a5c second commit
db1d6f137952f2b24e3c85724ebd7528587a067a first commit

此刻问题来了,提交工具的这40位hash值欠好影象,Git引用相当于给40位hash值取一个体名,便于识别和读取。Git引用工具都存储在.git/refs目次下,该目次下有3个子文件夹headstagsremotes,别离对应于HEAD引用、标签引用和长途引用,下面别离讲一讲每种引用的道理。

HEAD引用

HEAD引用是用来指向每个分支的最后一次提交工具,这样切换到一个分支之后,才气知道分支的“尾巴”在那边。HEAD引用存储在.git/refs/heads目次下,有几多个分支,就有相应的同名HEAD引用工具。譬喻代码库内里有mastertest两个分支,那么.git/refs/heads目次下就存在mastertest两个文件,别离记录了分支的最后一次提交。

HEAD引用的内容就是提交工具的hash值,理论上我们可以手动地结构一个HEAD引用:

$ echo "3ac728ac62f0a7b5ac201fd3ed1f69165df8be31" > .git/refs/heads/master

Git提供了一个专有呼吁update-ref,用来查察和修改Git引用工具,虽然也包罗HEAD引用:

$ git update-ref refs/heads/master 3ac728ac62f0a7b5ac201fd3ed1f69165df8be31
$ git update-ref refs/heads/master
3ac728ac62f0a7b5ac201fd3ed1f69165df8be31

上面的呼吁我们将master分支的HEAD指向了3ac728ac62f0a7b5ac201fd3ed1f69165df8be31,此刻用git log查察下master的提交汗青,可以发明最后一次提交就是所更新的hash值:

$ git log --pretty=oneline master
3ac728ac62f0a7b5ac201fd3ed1f69165df8be31 (HEAD -> master) third commit
d4d2c6cffb408d978cb6f1eb6cfc70e977378a5c second commit
db1d6f137952f2b24e3c85724ebd7528587a067a first commit

同理,可以利用同样的要领更新test分支的HEAD:

$ git update-ref refs/heads/test d4d2c6cffb408d978cb6f1eb6cfc70e977378a5c
$ git log --pretty=oneline test
d4d2c6cffb408d978cb6f1eb6cfc70e977378a5c (test) second commit
db1d6f137952f2b24e3c85724ebd7528587a067a first commit

.git/refs/heads目次下存储了每个分支的HEAD,那怎么知道代码库当前处于哪个分支呢?这就需要一个代码库级此外HEAD引用。.git/HEAD这个文件就是整个代码库级此外HEAD引用。我们先查察一下.git/HEAD文件的内容:

$ cat .git/HEAD
ref: refs/heads/master

我们发明.git/HEAD文件的内容不是40位hash值,而像是指向.git/refs/heads/master。实验切换到test

$ git checkout test
$ cat .git/HEAD
ref: refs/heads/test

切换分支后,.git/HEAD文件的内容也随着指向.git/refs/heads/test.git/HEAD也是HEAD引用工具,与一般引用差异的是,它是“标记引用”。标记引用雷同于文件的快捷方法,链接到要引用的工具上。

Git提供专门的呼吁git symbolic-ref,用来查察和更新标记引用:

$ git symbolic-ref HEAD refs/heads/master
$ git symbolic-ref HEAD refs/heads/test

至此,我们阐明白两种HEAD引用,一种是分支级此外HEAD引用,用来记录各分支的最后一次提交,存储在.git/refs/heads目次下,利用git update-ref来维护;一种是代码库级此外HEAD引用,用来记录代码库所处的分支,存储在.git/HEAD文件,利用git symbolic-ref来维护。

标签引用

标签引用,顾名思义就是给Git工具打标签,便于影象。譬喻,我们可以将某个提交工具打v1.0标签,暗示是1.0版本。标签引用都存储在.git/refs/tags内里。

标签引用和HEAD引用本质是Git引用工具,同样利用git update-ref来查察和修改:

$ git update-ref refs/tags/v1.0 d4d2c6cffb408d978cb6f1eb6cfc70e977378a5c
$ cat .git/refs/tags/v1.0
d4d2c6cffb408d978cb6f1eb6cfc70e977378a5c