“git fetch --tags”是否包含“git fetch”?
题
一个很好又简单的问题 - “git fetch”的功能是一个严格的子集 git fetch --tags
?
IE。如果我跑 git fetch --tags
, ,是否有理由立即运行 git fetch
之后直接?
关于什么 git pull
和 git pull --tags
?同样的情况?
解决方案
注意:从 git 1.9 / 2.0开始(2014年第1季度), git fetch --tags
除之外还提取标记在没有选项的情况下由同一命令行提取的内容。
请参阅提交c5a84e9 / mhagger“rel =”noreferrer“> Michael Haggerty(mhagger):
以前,fetch的“
- tags
”选项被认为等同于指定refspecrefs/tags/*:refs/tags/*
在命令行上; 特别是,它导致
remote。< name> .refspec
配置被忽略。但是在没有获取其他引用的情况下获取标记并不是非常有用,而 除了其他引用之外还能够获取标记非常有用。 BR> 因此,请更改此选项的语义以执行后者。
如果用户想要仅提取 标签,那么仍然可以指定显式的refspec:
git fetch <remote> 'refs/tags/*:refs/tags/*'
请注意,1.8.0.3之前的文档对于“
fetch --tags
”的这一方面含糊不清。行为。结果 提交f0cb2f1 (2012-12-14)fetch --tags
使文档符合旧行为。
此提交更改文档以匹配新行为(请参阅 <代码>文档/取回options.txt 代码> )。请求从远程获取所有标签以及正在提取的其他任何标签。
自Git 2.5(2015年第2季度) git pull --tags
更强大:
请参阅提交19d122b / pyokagan“rel =”noreferrer“> Paul Tan( pyokagan
),2015年5月13日。
( Junio C Hamano - gitster
- 合并于 commit cc77b99 ,2015年5月22日)
pull
:在没有合并候选案例的情况下删除- tags
错误自 441ed41 (&quot;
git pull --tags
&quot;:错误地输出更好的消息。, 2007-12-28,Git 1.5.4+),git pull --tags
会打印出不同的错误信息git-fetch
没有返回任何合并候选人:It doesn't make sense to pull all tags; you probably meant: git fetch --tags
这是因为那时
git-fetch --tags
会覆盖任何 配置refspecs,因此没有合并候选人。因此引入了错误消息以防止混淆。但是,自 c5a84e9 (
fetch --tags
:除了之外,还可以获取标签 其他的东西,2013-10-30,Git 1.9.0+),git fetch --tags
会另外获取标签 任何配置的refspecs。
因此,如果没有合并候选者情况发生,那不是因为设置了- tags
。因此,此特殊错误消息现在无关紧要。为防止混淆,请删除此错误消息。
使用Git 2.11 +(2016年第4季度) git fetch
更快。
其他提示
笔记:这个答案仅对 git v1.8 及更早版本有效。
大部分内容已经在其他答案和评论中说了,但这里有一个简洁的解释:
git fetch
获取所有分支头(或所有由remote.fetch 配置选项指定的分支头)、它们所需的所有提交以及可从这些分支访问的所有标记。在大多数情况下,所有标签都可以通过这种方式访问。git fetch --tags
获取所有标签以及它们所需的所有提交。它会 不是 更新分支头,即使可以从获取的标签访问它们。
概括:如果您确实想完全保持最新状态,仅使用 fetch,则必须同时执行这两项操作。
它也不是“慢两倍”,除非您指的是在命令行上键入,在这种情况下别名可以解决您的问题。发出这两个请求基本上没有任何开销,因为它们请求不同的信息。
我自己会回答这个问题。
我已经确定存在差异。 “git fetch --tags”可能会引入所有标签,但它不会带来任何新的提交!
事实证明,必须做到这一点完全是“最新的”,即复制了一个“git pull”。没有合并:
$ git fetch --tags
$ git fetch
这是一种耻辱,因为它的速度慢了两倍。如果只是“git fetch”可以选择按照正常情况执行和引入所有标记。
这里的普遍问题是 git fetch
将获取 +refs/heads/*:refs/remotes/$remote/*
. 。如果这些提交中有任何一个具有标签,那么这些标签也将被获取。但是,如果远程上的任何分支都无法访问某些标签,则不会获取它们。
这 --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/*"
这将添加第二个 fetch =
线在 .git/config
对于这个遥控器。
我花了一段时间寻找处理这个项目的方法。这就是我想出来的。
git fetch -fup origin "+refs/*:refs/*"
就我而言,我想要这些功能
- 从远程获取所有头和标签,因此使用 refspec
refs/*:refs/*
- 使用非快进覆盖本地分支和标签
+
在参考规范之前 - 如果需要,覆盖当前签出的分支
-u
- 删除远程中不存在的分支和标签
-p
- 并强制确定
-f
在大多数情况下, git fetch
应该做你想要的,即“从远程存储库获取任何新内容并将其放入本地副本而不合并到本地分支”。 git fetch --tags
就是这样做的,除了除了新标签之外它什么都没有。
从这个意义上讲, git fetch --tags
绝不是 git fetch
的超集。事实上恰恰相反。
git pull
,当然,只不过是 git fetch&lt; thisrefspec&gt;的包装器; git merge
。建议您在跳转到 git pull
之前习惯于手动 git fetch
和 git merge
,因为它可以帮助你首先要了解 git pull
正在做什么。
话虽如此,这种关系与 git fetch
完全相同。 git pull
是 git pull --tags
的超集。
git fetch upstream --tags
工作正常,它只会获得新标签,不会获得任何其他代码库。