“git fetch -tags”包含“git fetch”吗?
一个不错的和简单的问题 – 是“git fetch” git fetch --tags集的git fetch --tags吗?
也就是说,如果我运行git fetch --tags ,是否有任何理由立即直接运行git fetch ?
怎么样git pull和git pull --tags ? 同样的情况?
注意:从git 1.9 / 2.0(2014年第1季度)开始 , git fetch --tags 除了获取相同的命令行而没有选项的内容之外, git fetch --tags获取标签。
参见Michael Haggerty的 提交c5a84e9 (mhagger) :
以前,提取的“
--tags”选项被认为等同于指定--tagsrefs/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%
这仅适用于以下情况:
- 你在客户端有很多的包使得
reprepare_packed_git()昂贵(最昂贵的部分是在一个未sorting的列表中查找重复项,这个列表当前是二次的)。- 在服务器端需要大量的标签引用,这些标签引用是自动跟踪(即,客户端不具备)的候选对象。 每一个触发重新读取包目录。
- 在正常情况下,客户端会自动跟踪这些标签,并且在一次大的获取之后,(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 --tags是git 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 pull是git pull --tags的超集。