branch。<name> .merge`代表远程跟踪分支还是上游分支?

时间:2019-01-14 19:43:37

标签: git

branch.<name>.merge代表远程跟踪分支还是上游分支?

  1. 使用Git的版本控制

      

    但是Git怎么知道合并那些特定的分支?答案   来自配置文件:

    [branch "master"]
            remote = origin
            merge = refs/heads/master
    
         

    换句话说,这为Git提供了两个关键信息:master时   是当前已签出的分支,使用origin作为默认远程   在获取(或拉取)期间从中获取更新。   此外,在git pull的合并步骤中,使用refs/heads/master   从远程作为默认分支合并到此,主   分支。

    引号说:“在git pull的合并步骤中,使用 来自远程的refs/heads/master作为要合并的默认分支 进入主分支。”在我看来, branch.<name>.merge代表一个远程跟踪分支,而不是 上游分支。

    但是refs/heads/master中的merge = refs/heads/master看起来没有 就像一个远程跟踪分支(看起来像 refs/remotes/<remote>/master),但是一个主题分支,因此看起来 对我来说只是一个上游分支。

  2. git config的联机帮助页上说

    branch.<name>.merge
    
         

    与branch..remote一起定义上游的分支   给定的分支。

    似乎branch.<name>.merge代表上游分支 而不是远程跟踪分支。

  3. branch.<name>.merge是否有可能同时暗示一个远程 跟踪分支和上游分支?我不认为是 可能,因为远程跟踪分支及其相应的 上游分支可以具有不同的基名,具体取决于 remote.<remote>.fetch已配置。

谢谢。

2 个答案:

答案 0 :(得分:1)

简而言之,branch.<name>.merge包含远程服务器上远程分支的名称:它是上游分支。

如何说服自己这是真的:

假设分支origin/dev1存在,但本地dev1还不存在,请运行以下命令:

git checkout dev1
git branch -m dev1 dev2

这些命令将dev1设置为origin/dev1作为上游,然后将其重命名为dev2

我的.git/config中的结果是这样的:

[branch "dev2"]
    remote = origin
    merge = refs/heads/dev1

现在,refs/heads/dev1是我的沙箱中不存在的任何东西,仅存在于遥控器上。

根据评论中的讨论进一步澄清名称:

本地分支masterdev2是可以从其上游分支进行更新的本地分支。

远程跟踪分支origin/masterrefs/remotes/origin/master是在上一个git fetch或最后一个{ git pull

上游分支:这是真正的远程分支,位于远程服务器本身,而不是本地服务器。

答案 1 :(得分:1)

git config remote.origin.fetch将显示“ refspec”,该映射将origin遥控器上的参考名称映射到本地“远程跟踪分支”参考。

默认值为

+refs/heads/*:refs/remotes/origin/*

,它说提取了所有以“ refs / heads /”开头的原始引用,并在本地重写中替换了*的文本,因此refs/heads/master *是{ {1}},这就是在本地ref(“远程跟踪分支” ref 1 )中为master嵌入的内容。

配置文件指定分支的上游来自哪个存储库,以及该存储库中的refname是什么。当您进行基础调整,拉取或合并并采用隐式上游时,Git会查看其源存储库的分支名称和refspec(通常为*),并弄清楚该存储库中将映射到哪个ref。 / p>

所以

origin

本地分支[branch "master"] remote = origin merge = refs/heads/master [remote "origin"] url = git://github.com/git/git fetch = +refs/heads/*:refs/remotes/origin/* 跟踪master的分支origin,并从master进行获取,将此处的分支映射到origin,这就是历史重新设置基准并拉动,默认情况下可能还有其他一些检查以查找历史记录在何处或是否存在分歧。


1 前导refs/remotes/origin/master的意思是“如果fetch放弃了历史,请不要抱怨”,这当然就是您希望fetch在运行时的操作方式只需跟踪遥控器的参考信息即可。有关更多默认行为,请参见获取文档,例如有时候您想获取标签,有时候不想要