一、绝对提交名 每一个提交的散列 ID 都是全局唯一的,不仅仅是对某一个版本库,而且是对任意和所有的版本库都是唯一的。 虽然标签名并不是全局唯一的,但他会明确的指向一个唯一的提交,这种指向是不会随着时间而改变的(当然,除非你明确的修改它)。
二、引用 引用(ref)是一个 SHA1 散列值,指向 Git 对象库中的对象,通常指向提交对象。 有三种不同的命名空间代表不同的引用:refs/heads/ref 代表本地分支,refs/remotes/ref 代表远程跟踪分支,refs/tags/ref 代表标签。 例如,一个叫做 dev 的本地特性分支就是 refs/heads/dev 的缩写。标签 v2.6.23 就是 refs/tags/v2.6.23 的缩写。
Git 自动维护几个用于特定目的的特殊符号引用。这些引用可以在使用提交的任何地方使用。
HEAD HEAD始终指向当前分支的最近提交。当切换分支时,HEAD 会更新为指向新分支的最近提交。
ORIG_HEAD 某些操作,例如合并(merge)和复位(reset),会把调整为新值之前的先前版本的 HEAD 记录到 ORIG_HEAD 中。可以使用 ORIG_HEAD 来恢复或回滚到之前的状态或者做一个比较。
FEARCH_HEAD 当使用远程库时,git feach 命令将所有抓取分支的头记录到 .git/FEACH_HEAD 中。FEARCH_HEAD 是最近抓取(fetch)的分支 HEAD 的简写,并且仅在刚刚抓取操作之后才有效。使用这个符号引用,哪怕是一个对没有指定分支名的匿名抓取操作,都可以也在 git fetch 时找到提交的 HEAD。
MERGE_HEAD 当一个合并操作正在进行时,其他分支的头暂时记录在 MERGE_HEAD 中。换言之,MERGE_HEAD 是正在合并进 HEAD 的提交。
三、相对提交名 Git 还提供了一种机制来确定相对另一个引用的提交,通常是分支的头。
在同一代提交中,插入符号 ^ 是用来选择不同的父提交的。给定一个提交 C,C^1 是其第一个父提交,C^2 是其第二个父提交,C^3 是其第三个父提交,等等
波浪线 ~ 用于返回父提交之前并选择上一代提交。同样,给定一个提交 C,C ~ 1是其第一个父提交,C ~ 2 是其第一个祖父提交,C ~ 3 是其第一个曾祖父提交。
Git 也支持其他形式的简写和组合。如 C^ 和 C ~ 两种简写形式分别等同于 C^1 和 C ~。
git rev-parse 命令最终决定把任何形式的提交名——标签、相对名、简写或绝对名称——转换成对象库中实际的、绝对的提交散列 ID。
$ git rev-parse master 726f3d32595255e243925ed1177fb621122a3508