git会使用每次commit的snapshot的哈希值做为被引用对象,通过HEAD, branch name, tag, fetch HEAD等等来指向不同的commit。
具体请参考文档:
Git Refs: What You Need to Know | Atlassian Git Tutorial
简单来说,git将所有commit组成一个大的类似链表或者树的结构,每一个commit都指向他的一个或多个父节点。在这些commit集合中,如果划归branch,git采用的做法就是让该branch指向某一个commit,在该commit之前(包括他自己)所有的commit都属于该branch。
而tag跟branch的概念比较像,只不过tag是不可变的branch,就是tag也是指向一个commit,但是之后在该commit之后追加的commit不再属于该tag,这个branch不一样。
而HEAD就是指向当前处于active 的commit。比如你切换到一个branch,那HEAD和当前的branch name都指向同一个commit。当在该branch有新的commit, HEAD和branch name都指向最新的提交。
如果你checkout某一个commit, 而不是一个branch name,或者checkout出一个只读的远程branch,这是HEAD也都会指向对应的commit,只不过这时候是属于detach状态。