繁体   English   中英

为什么git fetch origin + refs / heads / master:refs / remotes / origin / mymaster和git fetch origin master:mymaster的行为不同?

[英]Why behaviour of git fetch origin +refs/heads/master:refs/remotes/origin/mymaster and git fetch origin master:mymaster is different?

为什么行为

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”。

好的git fetch将快速转发您的本地引用,如果不存在则创建它。 所以:

git fetch origin master:mymaster

如果不存在, mymaster在本地创建分支mymaster ,然后

git fetch origin +refs/heads/master:refs/remotes/origin/mymaster

如果不存在,则在本地创建一个分支remotes/origin/mymaster

语法为src:dst ,其中src是远程的, dst本地的。

阅读gitrevisions手册页(运行git help revisions )并查找修订规范“ <refname> ”。 这是该文档的摘录:

<refname> ,例如masterheads/masterrefs/heads/master

符号引用名称。 例如master通常是指refs/heads/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>如果存在);
  6. 否则, 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解析为绝对引用名称(并且最终会以refs/heads/foo/bar )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM