什么是 Git 中的 HEAD
HEAD 是指向当前工作位置的特殊指针:正常情况下指向当前分支(如 main),分支再指向最新提交;检出具体提交或 tag 时进入游离 HEAD(detached HEAD)状态。HEAD~1、HEAD^ 等相对引用都以它为基准。
HEAD 是"你当前在哪"的指针:正常情况下它指向当前分支名,分支再指向最新提交——HEAD → main → a1b2c3d。你的一切操作(commit、checkout、reset)都以 HEAD 为基准。
HEAD 的两种状态
附着状态(正常):
cat .git/HEAD
# ref: refs/heads/main
HEAD 指向分支,提交时分支指针随之前进。
游离状态(detached HEAD):
git checkout a1b2c3d # 直接检出某提交
cat .git/HEAD
# a1b2c3d...(直接是提交哈希)
此时提交没有分支"接着",切走后这些提交会成为孤立对象。想保留:git switch -c 新分支名。
基于 HEAD 的相对引用
| 写法 | 含义 |
|---|---|
HEAD |
当前提交 |
HEAD^ / HEAD~1 |
上一个提交 |
HEAD~3 |
往上数第 3 个 |
HEAD@{2} |
reflog 中 2 步之前的 HEAD 位置 |
@{u} |
当前分支的上游(如 origin/main) |
常见问题(FAQ)
Q:HEAD 和分支是什么关系?
分支是指向提交的指针,HEAD 是指向分支(或直接指向提交)的指针——多一层间接。"当前分支"就是由 HEAD 决定的。
Q:reset --hard HEAD 是干什么?
把所有改动还原到当前提交——即丢弃工作区和暂存区的未提交内容。HEAD 自己不动。
Q:怎么看出自己处于游离状态?
git status 首行显示 "HEAD detached at a1b2c3d";git branch 里当前项是 * (HEAD detached at ...)。