何时在Git中创建本地远程跟踪分支?

时间:2015-02-17 23:13:54

标签: git

在本地Git存储库中,此文件夹包含克隆之后的HEAD文件:

.git\refs\remotes\origin\

当我从远程跟踪分支创建本地分支时,将在以下位置创建分支:

.git\refs\heads

当我将该本地分支上的更改推送到远程存储库时,将在以下位置创建该分支的新副本:

.git\refs\remotes\origin\

远程跟踪分支在最初被推送到远程存储库时是否首先在上面的文件夹中创建了?

1 个答案:

答案 0 :(得分:2)

您不应该关心存储分支的(因为您应该使用"广告"接口,git branchgit for-each-ref等等) 。 问题更有趣时。

远程跟踪分支只是refs/remotes名称空间中的引用。通常会增加一个级别,特别是遥控器本身的名称,因此对于名为origin的遥控器,分支将全部落入refs/remotes/origin

git clone命令在本地git配置文件(针对该存储库)中创建remote配置条目。假设您告诉git clone使用默认的origin名称,此配置条目将部分阅读:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*

这是名称空间的来源:fetch配置条目中的remote.origin行,即来自:

的内容
$ git config --get-all remote.origin.fetch

实际的远程跟踪分支创建发生在多个地方。

最明显的是fetch(或最初的clone步骤,其中包括fetch)或git remote update运行的轻微变化。这些命令询问远程有关其引用的信息。匹配一条或多条fetch行的内容将根据每个refspec的右侧复制并修改

这意味着,在git clonegit fetch origingit remote origin update期间,如果遥控器有refs/heads/foo(分支foo),则您自己的本地存储库获得相应的refs/remotes/origin/foo。如果之前没有,则会创建一个(本地)远程跟踪分支。

(如果您运行git fetch以阻止其获取分支foo,则跟踪分支会创建。例如,如果您运行{ {1}},这次抓取只会带来git fetch origin refs/heads/bar:refs/temp_bar。不同版本的git目前会或不会创建或更新refs/heads/bar:1.8.4之前的胜利,但更新的gits所有这些都假设正常的refs/remotes/origin/bar配置。)

fetch期间出现不太明显的情况。在这种情况下,当您的本地git成功提供对远程git push名称空间的引用时,您的本地git也将使用与{{1}相同的refspec映射创建或更新远程跟踪分支。 }}。 因此,使用默认设置,推送refs/heads以便创建分支git fetch在远程refs/heads/new 上创建(本地)远程跟踪分支foo(我把它放在粗体,因为我认为它是我认为的问题的答案

如果您将origin添加到refs/remotes/origin/new--prune命令,那么当时它还会删除远程跟踪分支,如果它们现在丢失了在远程 - 他们可以告诉,因为他们从远程获取所有引用。 (请注意,这与git fetch的{​​{1}}选项非常不同,后者用于删除遥控器上的分支,la git remote updategit push 。)