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

时间:2016-06-02 08:38:02

标签: git

的行为原因
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”。

2 个答案:

答案 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>,例如masterheads/masterrefs/heads/master

     

符号引用名称。例如。 master通常表示提交对象   由refs/heads/master引用。   如果您碰巧同时拥有heads/master和   tags/master,您可以明确说出来   heads/master告诉Git你的意思。   如果不明确,则通过第一场比赛消除<refname>的歧义   在以下规则中:

     
      
  1. 如果$GIT_DIR/<refname>存在,那就是你的意思   (这通常仅适用于HEADFETCH_HEAD,   ORIG_HEADMERGE_HEADCHERRY_PICK_HEAD);
  2.   
  3. 否则,refs/<refname>如果存在;
  4.   
  5. 否则,refs/tags/<refname>如果存在;
  6.   
  7. 否则,refs/heads/<refname>如果存在;
  8.   
  9. 否则,refs/remotes/<refname>如果存在;
  10.   
  11. 否则,refs/remotes/<refname>/HEAD如果存在。
  12.   

因此,您在实验中观察到的是,当您使用简单的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}结尾}})。