Git 引用 (Git ref) 只是一个包含 git commit 的 SHA-1 哈希值的文件。引用提交的最直接方法是通过其 SHA-1 哈希,这充当每个提交的唯一 ID。为了引用提交,您必须记住它的 SHA-1 哈希值,因此您可以使用易于记忆的 git ref 而不是记住 SHA-1 哈希值而不是哈希值。我们可以说 ref 是引用提交的间接方式,您可以将其视为提交的用户友好别名。
Refs 作为普通文件文本存储在.git/refs目录中。要探索项目存储库之一中的 refs,请导航到.git/refs或在项目根目录的 Git bash 中键入以下命令。
$ ls -F1 .git/refs
或者在项目根目录下的 Git bash 中输入命令
find .git/refs
您应该会看到以下结构,但它会包含不同的文件,具体取决于您的存储库中的分支、标签和远程。
$ ls -F1 .git/refs
heads/
master
remotes/
tags/
存储库的所有本地分支都在refs/heads/目录中定义。每个文件名匹配相应分支的名称,在文件中,你会找到一个提交哈希。这个提交哈希是分支尖端的位置。
引用
Git 使用称为参考日志或“reflogs”的机制来跟踪分支尖端的更新。除了分支提示引用日志之外,还为 Git 存储维护了一个特殊的引用日志。要探索 git reflogs,请导航到.git/logs/ref/heads以及git/logs/ref/stash (如果 git stash 已在 repo 上使用)。
reflogs 记录本地存储库中分支和其他分支的提示何时更新。引用日志在各种 Git 命令中很有用,用于指定引用的旧值。例如,HEAD@{2} 的意思是“HEAD 曾经是两步前的地方”。
$ git reflog HEAD@{2}
$ git reflog
此命令管理记录在 reflogs 中的信息。该命令采用各种子命令,并根据子命令采用不同的选项。以下是 reflogs 中一些和最常用的子命令。
git reflog [show] [log-options] []
git reflog expire [–expire=
[–rewrite] [–updateref] [–stale-fix]
[–dry-run | -n] [–verbose] [–all [–single-worktree] |
git reflog delete [–rewrite] [–updateref]
[–dry-run | -n] [–verbose] ref@{specifier}…
方括号中的单词如“show”、“log-options”是限定词,或者我们可以说git reflog命令的参数。
- Git Reflog Show: “show”子命令(在没有任何子命令的情况下也是默认的)显示命令(或 HEAD,默认情况下)中提供的引用的日志。 reflog 涵盖了所有最近的操作,此外 HEAD reflog 记录了分支切换。
- Git Reflog Expire: “expire”子命令修剪旧的 reflog 条目。早于“ expire ”时间的条目,或早于“ expire-unreachable ”时间且无法从当前提示访问的条目,将从引用日志中删除。这通常不被最终用户直接使用
- Git Reflog Delete: “delete”子命令从引用日志中删除单个条目。它的参数必须是一个确切的条目(例如“ git reflog delete master@{2} ”)。此子命令通常也不由最终用户直接使用。
- Git Reflog Exists: “exists”子命令检查引用是否有引用日志。如果引用日志存在,则以零状态退出,如果不存在则以非零状态退出。