git remote update和fetch之间的区别?

问题描述 投票:179回答:2

git remote update等于git fetch吗?

git git-remote git-fetch
2个回答
109
投票

更新:更多信息!

我应该从一开始就这样做:我在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),并查看current] > git remote updategit remote update的文档,看起来它们两者都可以执行基本相同的功能,即从多个远程站点获取新的提交,并提供正确的选项和参数。

获取所有遥控器

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

git fetch

这将从所有已配置的遥控器获取,前提是您没有为其设置--all

如果为true,则在使用git fetch --all remote.<name>.skipFetchAll的update子命令进行更新时,默认情况下将跳过此遥控器。 — git-fetch(1)

这等同于使用

git-remote(1)

[未指定要获取的任何远程组,并且在回购配置中也未设置git-config documentation,并且您的任何远程都未将git remote update 设置为true。

remotes.default没有提到remote.<name>.skipDefaultUpdate设置,但是我咨询了全能Google并从current 1.8.3.2 documentation for Git's configuration中找到了这个有用的解释:

remotes.default

您可以定义要通过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这样解释:

如果为true,则在使用remote.<name>.skipDefaultUpdatethe Git docs的update子命令进行更新时,默认情况下将跳过此远程控制器。>

获取指定的远程组

git-fetch(1)git-remote(1)都允许您指定多个远程对象和要获取的一组远程对象,而不是获取所有远程对象:

fetch

remote 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 --multiplethe docs参数。不能指定<repository>

<group>文档中的歧义

<refspec>s指定命令语法如下:

git remote update

请注意最后一部分,synopsis for git remote update?尾随的git remote update表示您可以使用该命令指定多个组和遥控器,这意味着它的行为与git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…] 相同...请参见两者之间的语法是如此相似?

但是,在同一文档中,[(<group> | <remote>)…]命令的说明仅说明了有关指定多个组和远程参数的内容,没有说明

[C]定义的存储库中一组命名的远程更新的[获取]更新。

因此,在指定多个单独的远程对象和多个远程组方面,尚不清楚...是否与git fetch --multiple相同。

获取单个遥控器

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

update

可能也可以使用

remotes.<group>

做同样的事情,但是正如我在上一节中提到的,git remote update的文档尚不清楚是否可以通过命令获取除单个group

以外的其他任何东西。

总结

正如我所解释的,git fetch --multiplegit fetch <remote> 在从多个远程站点进行获取方面表现相似。它们共享相似的语法和参数,尽管git remote update <remote> 较短,因此人们可能会发现它更易于键入和使用。

[可能无法像git remote update那样仅使用git fetch来获取单个远程,但正如我所指出的那样,文档并不清楚。

Aside

[上面的git remote updategit fetch所代表的Git瓷器命令之间的功能重复不是唯一的。我注意到git remote updategit fetch的情况类似,因为两者都可能需要一定范围的提交才能修补到新的基本提交。

[我猜想,随着Git多年来的发展,某些功能被(不可避免地?)复制了,也许有时是为了方便最终用户(例如,将范围传递给git fetch比传递一个范围更简单)。一遍又一遍地提交以选择范围)。显然,git remote update并不总是接受一定范围的提交,如git rebase --onto中所述:

[git rebase --onto学会了选择一定范围的提交(例如git cherry-pickgit cherry-pick),cherry-pick也是如此;但是,这些不支持更好的顺序控制cherry-pick

是,不是。 v1.7.2 release notes从所有遥控器(而不只是一个)获取。

无需查看代码即可查看git cherry-pick是否仅是一个shell脚本(可能),基本上,它会为每个远程服务器运行获取操作。 cherry-pick A..B可以更精细。


141
投票

是,不是。 v1.7.2 release notes从所有遥控器(而不只是一个)获取。

© www.soinside.com 2019 - 2024. All rights reserved.