“git fetch -tags”包含“git fetch”吗?

一个不错的和简单的问题 – 是“git fetch” git fetch --tags集的git fetch --tags吗?

也就是说,如果我运行git fetch --tags ,是否有任何理由立即直接运行git fetch

怎么样git pullgit pull --tags ? 同样的情况?

注意:从git 1.9 / 2.0(2014年第1季度)开始 , git fetch --tags 除了获取相同的命令行而没有选项的内容之外, git fetch --tags获取标签。

参见Michael Haggerty的 提交c5a84e9 (mhagger) :

以前,提取的“ --tags ”选项被认为等同于指定--tags

 refs/tags/*:refs/tags/* 

在命令行上; 尤其是它导致remote.<name>.refspecconfiguration被忽略。

但是取得标签并不会取得其他引用,这非常有用的,但除了其他引用之外,取得标签非常有用的。
所以改变这个选项的语义来做后者。

如果用户只想获取标签,那么仍然可以指定一个明确的refspec:

 git fetch <remote> 'refs/tags/*:refs/tags/*' 

请注意,1.8.0.3之前的文档对于“ fetch --tags ”行为的这一方面是不明确的。
提交f0cb2f1 (2012-12-14) fetch --tags使文档匹配旧的行为。
此提交更改文档以匹配新的行为(请参阅Documentation/fetch-options.txt )。

要求除了要提取的其他内容之外,还要从远程获取所有的标签。


由于Git 2.5(2015年第二季度) git pull --tags更强大:

请参阅2015年5月13日的Paul Tan( pyokagan ) 提交的19d122b 。
(由Junio C gitster合并- gitster -在cc77b99提交 ,2015年5月22日)

pull :删除 – --tags错误在没有合并的候选人的情况下

因为441ed41 (“ git pull --tags ”:出错信息更好,2007-12-28,Git 1.5.4+),如果git-fetch没有返回,那么git pull --tags会打印一个不同的错误信息任何合并人选:

 It doesn't make sense to pull all tags; you probably meant: git fetch --tags 

这是因为在那个时候, git-fetch --tags会覆盖任何configuration的git-fetch --tags ,因此不会有合并候选。 错误信息是这样引入的,以防止混淆。

然而,由于c5a84e9 ( fetch --tags除了其他东西,取得标签,2013-10-30,Git 1.9.0+),除了任何configuration的refspecs外, git fetch --tags还会获取标签。
因此,如果没有合并候选人的情况发生,这不是因为 – --tags被设置。 因此,这个特殊的错误信息现在是不相关的。

为防止混淆,请删除此错误消息。


使用Git 2.11+(Q4 2016) git fetch更快。

见Jeff King( peff )的 提交5827a03 (2016年10月13日) 。
(由Junio C gitster合并- gitster – in commit 9fcd144 ,2016年10月26日)

fetch :使用“quick” has_sha1_file作为标签后续

当从具有许多与我们所关注的分支无关的标签的远程获取数据时,在检查标签指向的对象(我们不会获取!)时,我们曾经浪费太多的周期太仔细了

这个补丁教导提取使用HAS_SHA1_QUICK牺牲速度的准确性,在情况下,我们可能会同时重新打包。

这里是包含的perf脚本的结果,它build立了一个类似于上面描述的情况:

 Test HEAD^ HEAD ---------------------------------------------------------- 5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3% 

这仅适用于以下情况:

  1. 你在客户端有很多的包使得reprepare_packed_git()昂贵(最昂贵的部分是在一个未sorting的列表中查找重复项,这个列表当前是二次的)。
  2. 在服务器端需要大量的标签引用,这些标签引用是自动跟踪(即,客户端不具备)的候选对象。 每一个触发重新读取包目录。
  3. 在正常情况下,客户端会自动跟踪这些标签,并且在一次大的获取之后,(2)将不再是真实的。
    但是,如果这些标签指向与客户端提供的内容断开连接的历史logging,那么它将永远不会自动跟随,而这些候选对象每次都会影响它。

注意:这个答案只适用于git v1.8及以上版本。

其他大部分的答案和评论都是这样说的,但是这里有一个简洁的解释:

  • git fetch获取所有分支头(或者由remote.fetchconfiguration选项指定的所有分支头),它们所需的所有提交以及从这些分支可到达的所有标签。 在大多数情况下,所有标签都可以通过这种方式到达。
  • git fetch --tags提取所有标签,所有提交都需要提交。 它不会更新分支头,即使它们可以从被取出的标签中获得。

总结:如果你真的想要完全保持最新,只使用获取,你必须同时做。

这也不是“慢两倍”,除非你的意思是在命令行input,在这种情况下别名解决你的问题。 提出这两个要求基本上没有开销,因为他们要求不同的信息。

我将自己回答这个问题。

我确定有一个区别。 “git fetch –tags”可能会带来所有的标签,但不会带来任何新的提交!

原来一个人必须这样做是完全“最新的”,即复制一个“混帐”没有合并:

 $ git fetch --tags $ git fetch 

这是一个耻辱,因为它慢了一倍。 如果只有“git fetch”有一个选项来做它通常做的事情, 带来所有的标签。

这里的一般问题是, git fetch将获取+refs/heads/*:refs/remotes/$remote/* 。 如果这些提交中有任何标签,那么这些标签也将被提取。 但是,如果远程的任何分支都不能访问标签,则不会被提取。

--tags选项将--tags切换到+refs/tags/*:refs/tags/* 。 你可以要求git fetch来抓取两者。 我很确定只是做一个git fetch && git fetch -t你会使用下面的命令:

 git fetch origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* 

如果你想使这个回购的默认值,你可以添加第二个refspec默认的提取:

 git config --local --add remote.origin.fetch +refs/tags/*:refs/tags/* 

这将在这个远程的.git/config添加第二个fetch =行。


我花了一段时间寻找处理这个项目的方式。 这是我想出来的。

 git fetch -fup origin +refs/*:refs/* 

在我的情况下,我想要这些function

  • 从远程抓取所有的头和标签,所以使用refspec refs/*:refs/*
  • 在refspec之前用非快进的+覆盖本地分支和标签
  • 如果需要覆盖当前签出的分支-u
  • 删除远程-p不存在的分支和标记
  • 并强制确定-f

在大多数情况下, git fetch应该做你想做的,就是'从远程仓库获取任何新东西,并把它放在本地副本中,而不合并到你的本地分支“。 git fetch --tags的确如此,除了它除了新标签之外没有任何东西。

从这个意义上说, git fetch --tagsgit fetch --tags的超集。 事实上恰恰相反。

git pull当然不过是git fetch <thisrefspec>; git merge一个包装git fetch <thisrefspec>; git merge git fetch <thisrefspec>; git merge 。 build议您在使用git pull之前,先习惯手动执行git fetch ing和git merge因为它可以帮助您理解git pull在做什么。

这就是说,这个关系和git fetch完全一样。 git pullgit pull --tags的超集。