11dd7bae304ccfa63b35a6eb8c
object 3ac728ac62f0a7b5ac201fd3ed1f69165df8be31
type commit
tag v1.1
tagger jingsam <jing-sam@qq.com> 1529481368 +0800
test tag
可以看到,上面的Git对象存储了我们填写的附注信息。
总之,普通的标签引用和附注引用同样都是存储的是40位hash值,指向一个Git对象,所不同的是普通的标签引用是直接指向提交对象,而附注标签是指向一个附注对象,附注对象再指向具体的提交对象。
另外,本质上标签引用并不是只可以指向提交对象,实际上可以指向任何Git对象,即可以给任何Git对象打标签。
远程引用
远程引用,类似于.git/refs/heads
中存储的本地仓库各分支的最后一次提交,在.git/refs/remotes
是用来记录多个远程仓库各分支的最后一次提交。
我们可以使用git remote
来管理远程分支:
$ git remote add origin git@github.com:jingsam/git-test.git
上面添加了一个origin
远程分支,接下来我们把本地仓库的master
推送到远程仓库上:
$ git push origin master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (9/9), 720 bytes | 360.00 KiB/s, done.
Total 9 (delta 0), reused 0 (delta 0)
To github.com:jingsam/git-test.git
* [new branch] master -> master
这时候在.git/refs/remotes
中的远程引用就会更新:
$ cat .git/refs/remotes/origin/master
3ac728ac62f0a7b5ac201fd3ed1f69165df8be31
和本地仓库的master
比较一下,发现是一模一样的,表示远程分支和本地分支是同步的:
$ cat .git/refs/heads/master
3ac728ac62f0a7b5ac201fd3ed1f69165df8be31
由于远程引用也是Git引用对象,所以理论上也可以使用git update-ref
来手动维护。但是,我们需要先把代码与远程仓库进行同步,在远程仓库中找到对应分支的HEAD,然后使用git update-ref
进行更新,过程比较麻烦。而我们在执行git pull
或git push
这样的高层命令的时候,远程引用会自动更新。
总结
到这里,三种Git引用都已分析完毕。总的来说,三种Git引用都统一存储到.git/refs
目录下,Git引用中的内容都是40位的hash值,指向某个Git对象,这个对象可以是任意的Git对象,可以是数据对象、树对象、提交对象。三种Git引用都可以使用git update-ref
来手动维护。
三种Git引用对象所不同的是,分别存储于.git/refs/heads
、.git/refs/tags
、.git/refs/remotes
,存储的文件夹不同,赋予了引用对象不同的功能。HEAD引用用来记录本地分支的最后一次提交,标签引用用来给任意Git对象打标签,远程引用正式用来记录远程分支的最后一次提交。