Git: “ branchname”和“ refs/head/branchname”之间的区别

最好用一个例子来解释: 我在库的0.58分支上,这是我如何拉:

git pull origin 0.58

当我刚刚调用“ git pull”时,我得到:

ip238:openlierox az$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.0.58.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.


If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:


branch.0.58.remote = <nickname>
branch.0.58.merge = <remote-ref>
remote.<nickname>.url = <url>
remote.<nickname>.fetch = <refspec>


See git-config(1) for details.

看来我可能忘记了一些选项(——轨道?)当我检查了那个分支。无论如何,我现在已经设置了这个:

git config branch.0.58.merge 0.58
git config branch.0.58.remote origin

这个看起来有用。然后,仅仅是出于兴趣,我看了一些关于这些设置的其他分支:

ip238:openlierox az$ git config branch.0.57.merge
refs/heads/0.57
ip238:openlierox az$ git config branch.0.57.remote
origin

我现在想知道,“0.58”和“ refs/head/0.58”之间有什么区别吗?

到底有什么区别?

94268 次浏览

ref是指向提交的任何内容,例如,分支(头)、标记和远程分支。您应该在 .git/refs目录中看到头部、远程和标记,假设您的存储库中包含所有三种类型的参考文献。

refs/heads/0.58指定一个名为0.58的 树枝。如果不指定 ref 所在的名称空间,git 将查看缺省名称空间。这使得仅使用0.58可以理解为模棱两可——您可以同时使用名为0.58的分支和标记。

对于那些好奇的人来说,git show-ref(自 Git v1.8.2.2以来就可用)将向您显示本地存储库中的所有引用。

看,在 GIT 能够实际识别它之前,需要完全解析 branchName。完全解析的名称将是 refs/heads/branchName

其中一个著名的命令 git checkout branchName实际上会自动完全解析它,以确定您想要签出的位置。请注意,它是自动完成的,因此我们从来没有完全自己编写它。

它是怎么做到的? 让我们看看 给你

Refname : ,例如 masterheads/masterrefs/heads/master

一个符号化的引用名称。例如 master 通常意味着提交对象 如果你碰巧两者都有 heads/mastertags/master,可以明确地说 heads/master到 告诉 Git 你指的是哪一个。当有歧义时,<refname>是 通过在下列规则中进行第一场比赛来消除歧义:

1. 如果 $GIT_DIR/<refname>存在,那就是你的意思(这通常只对 HEADFETCH_HEADORIG_HEADMERGE_HEADCHERRY_PICK_HEAD) ;

2. 否则,refs/<refname>(如果存在) ;

3. 否则,refs/tags/<refname>(如果存在) ;

4. 否则,refs/heads/<refname>(如果存在) ;

5. 否则,refs/remotes/<refname>(如果存在) ;

如果存在,则为 refs/remotes/<refname>/HEAD

因此,通过以上6个步骤,它试图解决什么是 branchName。因此,我们永远不需要给它一个完全解析的 Branch Name。

看看 给你给你

另外,进入 .git目录,查看 ref文件夹内的内容。

假设“分支名”是哈利, 然后

Harry 是一个指针,它只是用来指向该分支的最新提交。

而 refs/head/Harry 是一种历史跟踪器,可以跟踪使用 Harry 指针完成的每一个活动。它可以是任何活动,比如提交、切换到其他分支、推送分支的内容等等。