git refs 详解

Last Modified: 2023/06/22

概述

git 中有不少概念,这些概念是 git 比较复杂的地方,git 新手甚至不乏一些老手也会对某些概念模糊不清,本文将会为大家讲述 git ref 这个概念,希望对大家有用。本文将会介绍什么是 git ref,以及为什么使用 git ref,最后说下怎么使用 git ref。

什么是 git ref

git ref 是一种间接引用 commit(提交)的方式。你可以将 ref 看成 commit id(或者说 commit hash) 的一个友好的别名

refs 以普通文本文件的形式存储在项目根目录下的 .git/refs 子目录中,现在假设你的当前目录就是项目的根目录,让我们到 .git/refs 目录下一探究竟:

cd .git/refs
tree

输入结果如下:

.
├── heads
│   ├── dev
│   └── master
├── remotes
│   └── origin
│       └── dev
└── tags
    └── v1.0

每个仓库输出的内容可能都不尽相同,我们这里的总共有 5 个 ref,分别是 dev、master、origin/dev 和 v1.0,dev 和 master 在 heads 目录下,在 git heads 详解 一文中,我们对 git heads 有过详细的介绍,这里不赘述。

前面刚说到 git ref 就是 commit id 的别名,怎么知道这个 ref 是哪个 commit id 的别名呢?答案就隐藏在这些 ref 文件中,实际上 ref 文件存储的内容仅仅是一个 commit id。下面我们使用 cat 命令查看下名为 dev 的这个 ref 的 内容:

cat .git/refs/heads/dev

输出内容如下:

2ee020b37d0e04eb4289ff1e9979806774fbf003

为什么用 git ref

在什么是 git ref 一节中,我们提到了友好一词,为什么说友好?从上面的输出不难看出 commit id 是一串很长无意义的数字,不方便记忆和使用,对人类并不友好,ref 给了 commit id 一个别名,通过该别名我们就可以方便的引用某个 commit。

如何使用 git ref

从 .git/refs 目录的层次结构可以看出,tag 也是 ref 的一种,我们可以随时使用 git tag 来标记一个 commit,给某个 commit 打上 tag 之后就会在 refs/tags 目录下就会生成一个以 tag 名称命名的 ref 文件。之后我们想再次查看这个 commit 的改动时,我们无需记住这个 commit id,也就是说我们不需要使用 git show [commit id] 来查看此 commit 的相关信息,相反我们可以直接使用 ref 文件的名字来查看:

git show tagName

这里只是以 git show 作为例子说明 ref 的用法,其实还有很多命令接收 ref 名称,请大家自行探索。

有问题吗?点此反馈!

温馨提示:反馈需要登录