git远程更新和fetch之间的区别?

时间:2009-12-06 20:27:29

标签: git git-remote git-fetch

git remote update相当于git fetch

2 个答案:

答案 0 :(得分:139)

是和否。 git remote update从所有遥控器中取出,而不仅仅是一个。

不查看代码以查看remote update是否只是一个shell脚本(可能),它基本上为每个远程运行fetch。 git fetch可以更精细。

答案 1 :(得分:98)

更新:更多信息!

我应该从一开始就做到这一点:我在Git的Git回购中抓住了Git发行说明(所以meta!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

然后我对less进行了--all搜索,这就是我在release notes for Git version 1.6.6下找到的内容:

  

git fetch了解了--all--multiple个选项,用于从多个存储库运行提取,以及--prune选项用于删除过时的远程跟踪分支。这些会使git remote updategit remote prune变得不那么必要(虽然没有计划删除remote updateremote prune

版本1.6.6直到December 23rd, 2009才被发布,原版海报于2009年12月6日提出了他的问题。

从发行说明中可以看出,Git的作者意识到git remote update命令功能在某种程度上被git fetch复制了,但是他们决定不删除它,可能是为了与现有的脚本和程序向后兼容,或者因为它的工作量太大而且优先级较高的项目。


有更多详情的原始答案

xenoterracide's answer现在已经有3.5岁了,从那时起Git已经经历了几个版本(截至本文撰写时它已经从v1.6.5.5变为v1.8.3.2),并且看着<对于git remote updategit fetch的强> 当前 文档,看起来他们 两者都可以执行从提取新提交的基本相同的功能给出正确的选项和参数,多个遥控器

获取所有遥控器

获取多个遥控器的一种方法是使用--all标志:

git fetch --all

这将从您配置的所有遥控器中提取,假设您没有为其设置remote.<name>.skipFetchAll

  

如果为true,则在使用git-fetch(1)git-remote(1)的update子命令进行更新时,默认情况下将跳过此远程。 - git-config documentation

这相当于使用

git remote update

没有指定任何要提取的远程组,也没有在您的repo配置中设置remotes.default,并且没有任何遥控器将remote.<name>.skipDefaultUpdate设置为true。

current 1.8.3.2 documentation for Git's configuration并未提及remotes.default设置,但我向全能的Google咨询了相关信息,并从Mislav Marohnić找到了这个有用的解释:

$ git config remotes.default 'origin mislav staging'
$ git remote update

# fetches remotes "origin", "mislav", and "staging"
  

您可以定义remote update命令要提取的默认遥控器列表。这些可以是您的团队成员,开源项目的可信社区成员或类似人员的遥控器。

因此,如果您设置了remotes.default,并且并未在其中列出所有遥控器,那么git remote update将无法获取您的回购信息所知道的所有遥控器&#34;意识到& #34;的。

对于remote.<name>.skipDefaultUpdate设置,the Git docs如此解释:

  

如果为true,则在使用git-fetch(1)git-remote(1)的更新子命令进行更新时,默认情况下会跳过此远程。

获取指定的一组遥控器

fetchremote update允许您指定多个遥控器和遥控器组来取取所有遥控器:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group>允许您获取属于组的多个遥控器(从Mislav借用另一个示例):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multiple允许您指定多个存储库和存储库组,以便一次性获取(来自the docs):

  

允许指定多个<repository><group>个参数。不能指定<refspec>s

git remote update文档中的歧义

synopsis for git remote update指定命令语法如下:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

注意最后一部分[(<group> | <remote>)…]?尾随点...意味着您可以使用该命令指定多个组和远程数据库,这意味着它的行为方式与git fetch --multiple相同...请参阅两者之间的语法如何相似?

但是,在同一文档中,update命令的解释没有说明指定多个组和远程参数,只是它

  

根据remotes.<group>的定义,获取存储库中一组命名遥控器的[es]更新。

因此,我不清楚git remote update在指定多个单独的遥控器和多个远程组方面是否与git fetch --multiple完全相同。

获取单个遥控器

最后,每个人都知道获取单个遥控器的简单情况:

git fetch <remote>

可能您也可以使用

git remote update <remote>

做同样的事情,但正如我在上一节中提到的那样,git remote update的文档不清楚是否可以获取除 组之外的任何内容 使用该命令的遥控器。

结束语

正如我所解释的那样,git fetchgit remote update在从多个遥控器获取方面表现相似。它们共享相似的语法和参数,但git fetch更短,因此人们可能会发现它更容易键入和使用。

可能会出现git remote update无法仅使用git fetch来获取单个遥控器的情况,但正如我已经指出的那样,文档没有&#39}这个清楚。

<强>除了

Git瓷器命令之间的功能重复,例如上面的git fetchgit remote update,并不是唯一的。我注意到与git rebase --ontogit cherry-pick类似的情况,因为两者都可以进行一系列提交以修补新的基础提交。

我想,随着Git多年来的发展,一些功能(不可避免地?)重复,有时可能为最终用户提供便利(例如,将范围传递给{{1}更简单而不是一遍又一遍地传递一个提交来挑选一个范围)。显然,cherry-pick并不总是接受一系列提交,如v1.7.2 release notes中所述:

  

cherry-pick学会了选择一系列提交(例如git cherry-pickcherry-pick A..B),cherry-pick --stdin也是如此。但是,这些不支持更好的排序控制git revert