您可以看到Git文档中说:
分支必须在HEAD中完全合并。
但是Git中的HEAD
究竟是什么?
我仍在探索git的内部机制,迄今已经了解到以下内容:
假设当前分支是master。
% cat .git/HEAD
ref: refs/heads/master
refs/heads/master 是一个文件,通常包含 master 分支最新提交的哈希值:% cat .git/refs/heads/master
f342e66eb1158247a98d74152a1b91543ece31b4
% git log --oneline
f342e66 (HEAD -> master,...) latest commit
fa99692 parent of latest commit
分支实际上是一个保存提交ID(比如17a5)的指针。 HEAD是指向用户当前正在工作的分支的指针。
HEAD有一个引用文件,看起来像这样:
ref:
您可以通过访问您正在处理的存储库中的.git/HEAD
.git/refs
来检查这些文件。
这两个可能会让你感到困惑:
head
指向最近提交的分支的命名引用。除非使用包引用,否则通常存储在$GIT_DIR/refs/heads/中。
HEAD
当前分支,或者您的工作树通常是从HEAD指向的树生成的。HEAD必须指向一个head,除非您正在使用分离的HEAD。
请查看http://git-scm.com/book/zh/v2/Git-分支-分支是什么
图3-5. HEAD 文件指向你所在的分支。
HEAD
所指的内容取决于你是在讨论裸库还是非裸库。在非裸库的情况下,它实际上指的是当前检出的提交,这不需要有一个分支与之关联(即当处于分离的 HEAD
状态时)。 - user456814HEAD 实际上只是一个存储当前分支信息的文件
如果你在 git 命令中使用 HEAD,那么你就是指向你当前的分支
你可以通过以下命令查看这个文件的数据:cat .git/HEAD
git ls-remote
),但“HEAD”的定义似乎很难确定。git branch的文档简单地说明HEAD
实际上是“当前分支的末端”。所有的混淆实际上都必须关于分支的定义 - 这是令人惊讶的微妙:我们到底是什么意思“branch”? - Brent Bradburn