一个很好的简单的问题——“git fetch”函数是git fetch -tags的严格子集吗?
例如,如果我运行git fetch—tags,是否有理由立即运行git fetch ?
那"少不要脸"和"少不要脸"呢?同样的情况?
一个很好的简单的问题——“git fetch”函数是git fetch -tags的严格子集吗?
例如,如果我运行git fetch—tags,是否有理由立即运行git fetch ?
那"少不要脸"和"少不要脸"呢?同样的情况?
当前回答
注意:这个答案只对git v1.8及更老版本有效。
大多数问题已经在其他的回答和评论中提到了,但这里有一个简明的解释:
Git获取所有分支头(或远程指定的所有分支头)。获取配置选项),所有必要的提交,以及所有可从这些分支访问的标记。在大多数情况下,所有标签都可以通过这种方式访问。 Git fetch——tags获取所有标签,所有必要的提交。它不会更新分支头,即使它们可以从所获取的标记中访问。
总结:如果你真的想要完全更新,只使用fetch,你必须两者都做。
它也不是“两倍慢”,除非你指的是在命令行上输入,在这种情况下,别名可以解决你的问题。发出这两个请求基本上没有开销,因为它们请求的是不同的信息。
其他回答
我自己来回答这个问题。
我认为这是有区别的。"git fetch——tags"可能会带来所有的标签,但它不会带来任何新的提交!
事实证明,必须这样做才能完全“更新”,即复制一个“git pull”而不合并:
$ git fetch --tags
$ git fetch
这很遗憾,因为它要慢一倍。如果“git fetch”有一个选项来做它通常做的事情,并带来所有的标签。
在大多数情况下,git fetch应该做你想做的事情,即“从远程存储库中获取任何新的东西,并将其放在本地副本中,而不合并到本地分支中”。Git fetch——tags就是这么做的,除了新标签,它什么都不获取。
从这个意义上说,git fetch——tags绝不是git fetch的超集。事实恰恰相反。
Git pull,当然,只是一个包装Git fetch <thisrefspec>;git合并。建议您在跳转到git pull之前先习惯手动git抓取和git合并,因为这可以帮助您首先理解git pull在做什么。
话虽如此,这种关系与git fetch完全相同。Git pull是Git pull -tags的超集。
注意:这个答案只对git v1.8及更老版本有效。
大多数问题已经在其他的回答和评论中提到了,但这里有一个简明的解释:
Git获取所有分支头(或远程指定的所有分支头)。获取配置选项),所有必要的提交,以及所有可从这些分支访问的标记。在大多数情况下,所有标签都可以通过这种方式访问。 Git fetch——tags获取所有标签,所有必要的提交。它不会更新分支头,即使它们可以从所获取的标记中访问。
总结:如果你真的想要完全更新,只使用fetch,你必须两者都做。
它也不是“两倍慢”,除非你指的是在命令行上输入,在这种情况下,别名可以解决你的问题。发出这两个请求基本上没有开销,因为它们请求的是不同的信息。
这里的一般问题是git fetch将fetch +refs/heads/*:refs/remotes/$remote/*。如果这些提交中的任何一个有标记,这些标记也将被获取。但是,如果远程上的任何分支都无法到达标记,则不会获取它们。
——tags选项将refspec转换为+refs/tags/*:refs/tags/*。你可以让git fetch抓取两者。我很确定只要执行git fetch && git fetch -t,你就会使用以下命令:
git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"
如果你想让它成为这个repo的默认值,你可以添加第二个refspec到默认的取回:
git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"
这将在.git/config中为这个远程添加第二个fetch =行。
我花了一段时间寻找处理这个项目的方法。这是我想到的。
git fetch -fup origin "+refs/*:refs/*"
就我而言,我想要这些功能
从遥控器抓取所有头部和标签,因此使用refspec refs/*:refs/* 在refspec之前使用非快进+覆盖本地分支和标记 如果需要,覆盖当前签出的分支 删除remote -p中不存在的分支和标签 当然还有力-f
git fetch upstream --tags
工作得很好,它只会得到新的标记,而不会得到任何其他代码基。