的行为原因
git fetch origin +refs/heads/master:refs/remotes/origin/mymaster
和
git fetch origin master:mymaster
是不同的?
在我的观察中
git fetch origin +refs/heads/master:refs/remotes/origin/mymaster
它正在创建一个远程跟踪分支“mymaster”。
另一个案例
git fetch origin master:mymaster
它正在创建一个本地分支“mymaster”。
答案 0 :(得分:1)
好git fetch
会快进您的本地参考,如果它不存在则创建它。所以:
git fetch origin master:mymaster
如果它不存在,则在本地创建一个分支mymaster
git fetch origin +refs/heads/master:refs/remotes/origin/mymaster
如果它不存在,则在本地创建一个分支remotes/origin/mymaster
。
语法为src:dst
,其中src
是远程的,dst
是本地的。
答案 1 :(得分:1)
阅读gitrevisions
手册页(运行git help revisions
)并查找修订版规范“<refname>
”。以下是该文档的摘录:
<refname>
,例如master
,heads/master
,refs/heads/master
符号引用名称。例如。
master
通常表示提交对象 由refs/heads/master
引用。 如果您碰巧同时拥有heads/master
和tags/master
,您可以明确说出来heads/master
告诉Git你的意思。 如果不明确,则通过第一场比赛消除<refname>
的歧义 在以下规则中:
- 如果
$GIT_DIR/<refname>
存在,那就是你的意思 (这通常仅适用于HEAD
,FETCH_HEAD
,ORIG_HEAD
,MERGE_HEAD
和CHERRY_PICK_HEAD
);- 否则,
refs/<refname>
如果存在;- 否则,
refs/tags/<refname>
如果存在;- 否则,
refs/heads/<refname>
如果存在;- 否则,
refs/remotes/<refname>
如果存在;- 否则,
醇>refs/remotes/<refname>/HEAD
如果存在。
因此,您在实验中观察到的是,当您使用简单的mybranch
作为目标引用名称时,从Git的角度来看,这是相对引用名称,并且因此,Git使用优先级规则来解决它,并将其解析为refs/heads/mymaster
。
当你使用refs/remotes/origin/mymaster
时,你为Git提供了绝对引用名称,所以没有什么可以解决的,Git直接使用它。
一个兴趣点:在名称中包含斜杠的本地分支是完全可以的,并且在没有refs/...
锚点的情况下指定时它仍然是相对的。也就是说,您可以执行git branch foo/bar
,稍后您将调用git log foo/bar
Git将使用上述规则将foo/bar
解析为绝对引用名称(并且最终会以{{1}结尾}})。