您可以看到Git文档中这样说
分支必须在HEAD中完全合并。
但Git HEAD到底是什么?
您可以看到Git文档中这样说
分支必须在HEAD中完全合并。
但Git HEAD到底是什么?
当前回答
分支实际上是一个持有提交ID(例如17a5)的指针。 HEAD是指向用户当前工作的分支的指针。
HEAD有一个如下所示的引用流:
ref:
您可以通过访问您正在工作的存储库中的.git/HEAD .git/refs来检查这些文件。
其他回答
看看http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is
图3 - 5。HEAD文件指向你所在的分支。
Head指向当前签出分支的顶端。
在您的存储库中,有一个.git文件夹。在这个位置打开文件:.git\refs\heads。该文件(在大多数情况下是master)中的(sha-1哈希)代码将是最近的提交,即在命令git日志的输出中看到的代码。关于.git文件夹的更多信息:http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
您可以将HEAD视为“当前分支”。当您使用git签出切换分支时,HEAD修订将更改为指向新分支的尖端。
你可以通过这样做来查看HEAD指向什么:
cat .git/HEAD
在我的例子中,输出是:
$ cat .git/HEAD
ref: refs/heads/master
HEAD可以引用与分支名称不关联的特定修订。这种情况被称为分离HEAD。
为了理解HEAD是什么,让我们使用一个实际的例子,其中有两个不同的分支,main和feature1,来自两个不同的开发人员Dev1和Dev2,他们在同一个项目上工作。
Dev1主分支的案例1:
name~/repo (main)
$ ls -al
total 9
drwxr-xr-x 1 AlphaLy 197121 0 Dec 22 15:09 ./
drwxr-xr-x 1 AlphaLy 197121 0 Dec 21 20:35 ../
drwxr-xr-x 1 AlphaLy 197121 0 Dec 22 15:09 .git/
-rw-r--r-- 1 AlphaLy 197121 20 Dec 21 20:35 README.md
-rw-r--r-- 1 AlphaLy 197121 0 Dec 22 15:09 test.txt
Next1
name~/repo (main)
$ cd .git/
name~/repo/.git (GIT_DIR!)
$ ls
COMMIT_EDITMSG description HEAD index logs/ ORIG_HEAD refs/
config FETCH_HEAD hooks/ info/ objects/ packed-refs
Next2
name~/repo/.git (GIT_DIR!)
$ cat HEAD
ref: refs/heads/main
我们可以清楚地看到HEAD是一个文件,其中一行指向refs/heads目录中的一个名为main的文件(heads是refs目录中的一个目录)。参考Next1步骤定位refs目录
现在让我们转到Next1步骤,cd到refs目录,在heads目录中搜索主文件,看看它包含什么
name~/repo/.git (GIT_DIR!)
$ cd refs
name~/repo/.git/refs (GIT_DIR!)
$ ls
heads/ remotes/ tags/
name~/repo/.git/refs/ (GIT_DIR!)
$ cd heads/
name~/repo/.git/refs/heads (GIT_DIR!)
$ ls
main maxi
name~/repo/.git/refs/heads (GIT_DIR!)
$ cat main
8b25d89f3396177416c055ab07ebf778616eecdd
8b25d89f3396177416c055ab07ebf778616eecdd是当前提交。因此,我们可以说HEAD指向一个名为main的文件(总是以当前分支命名),该文件包含当前提交(上面的40位字符)。HEAD指的是当前提交。
带有Dev2的feature1分支的案例2
在这里,唯一的区别是在Next2步骤中
name~/repo/.git (GIT_DIR!)
$ cat HEAD
ref: refs/heads/feature1
以及以下几点:
name~/repo/.git (GIT_DIR!)
$ cat feature1
03fbf973ac1014085864234010b82393208ebbd6
03fbf973ac1014085864234010b82393208ebbd6是在feature1分支上的当前提交。因此,这里HEAD再次指向一个名为feature1的文件(以当前分支命名),该文件包含当前提交(上面的40位字符)。
结论:
HEAD是指当前提交而不是当前分支。这只是一个巧合,包含当前提交的文件以当前分支命名,我们倾向于说'HEAD指向当前分支'。
引用别人的话:
A head is simply a reference to a commit object. Each head has a name (branch name or tag name, etc). By default, there is a head in every repository called master. A repository can contain any number of heads. At any given time, one head is selected as the “current head.” This head is aliased to HEAD, always in capitals". Note this difference: a “head” (lowercase) refers to any one of the named heads in the repository; “HEAD” (uppercase) refers exclusively to the currently active head. This distinction is used frequently in Git documentation.
可以在这里找到另一个很好的源代码,它可以快速覆盖git的内部工作原理(因此可以更好地理解heads/HEAD)。引用(ref:)或头或分支可以被看作是粘贴在提交历史记录中的提交上的便利贴。通常它们指向一系列提交的提示,但它们可以随着git checkout或git reset等移动。