branch.<name>.merge
代表远程跟踪分支还是上游分支?
使用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
),但是一个主题分支,因此看起来
对我来说只是一个上游分支。
git config
的联机帮助页上说
branch.<name>.merge
与branch..remote一起定义上游的分支 给定的分支。
似乎branch.<name>.merge
代表上游分支
而不是远程跟踪分支。
branch.<name>.merge
是否有可能同时暗示一个远程
跟踪分支和上游分支?我不认为是
可能,因为远程跟踪分支及其相应的
上游分支可以具有不同的基名,具体取决于
remote.<remote>.fetch
已配置。谢谢。
答案 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
是我的沙箱中不存在的任何东西,仅存在于遥控器上。
根据评论中的讨论进一步澄清名称:
本地分支:master
或dev2
是可以从其上游分支进行更新的本地分支。
远程跟踪分支:origin/master
或refs/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在运行时的操作方式只需跟踪遥控器的参考信息即可。有关更多默认行为,请参见获取文档,例如有时候您想获取标签,有时候不想要