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

Dav*_*vid 173 git git-fetch git-remote

git remote update相当于git fetch

xen*_*ide 141

是的,不是.git remote update从所有遥控器中取出,而不仅仅是一个.

在没有查看代码以查看是否remote update只是一个shell脚本(可能)的情况下,它基本上为每个远程运行fetch.git fetch可以更精细.

  • @tuler是的:它是`git fetch --all` (14认同)
  • 您可以在运行`git remote update`时配置要获取的远程控制器,请参阅git-remote联机帮助页. (3认同)
  • “git 远程更新”是否有等效的“git fetch”命令选项? (2认同)

小智 102

更新:更多信息!

我应该从一开始就这样做:我在Git的Git仓库中gre发布了Git发行说明(所以meta!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less
Run Code Online (Sandbox Code Playgroud)

然后我进行了less搜索--all,这是我在Git 1.6.6版发行说明中找到的:

git fetch学习--all--multiple选项,从许多存储库运行提取,以及--prune删除过时的远程跟踪分支的选项.这些使得git remote updategit remote prune更少的必要(有没有计划除去remote update也不remote prune,虽然).

版本1.6.6直到200912月23日才发布,原始海报于2009年12月6日提出了他的问题.

正如您从发行说明中看到的那样,Git的作者意识到git remote update命令功能在某种程度上被重复git fetch,但是他们决定不删除它,可能是为了与现有脚本和程序向后兼容,或者因为这只是太多的工作而且有更高优先级的项目.


原始答案更详细

xenoterracide的答案,现在为3.5岁,从那以后,Git有过好几个版本了(它已经从去v1.6.5.5到v1.8.3.2写这篇文章的),并期待在当前的文档git remote updategit fetch,它看起来就像他们都可以执行基本相同的功能,从多个遥控器获取新的提交,给定正确的选项和参数.

获取所有遥控器

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

git fetch --all
Run Code Online (Sandbox Code Playgroud)

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

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

这相当于使用

git remote update
Run Code Online (Sandbox Code Playgroud)

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

当前的1.8.3.2文档Git的配置中没有提及remotes.default的设置,但我咨询全能谷歌一下,发现从这个有用的解释MislavMarohnić:

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

# fetches remotes "origin", "mislav", and "staging"
Run Code Online (Sandbox Code Playgroud)

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

因此,假设您已remotes.default设置,而不是所有的遥控器都列在其中,那么git remote update将无法获取您的回购"意识到"的所有遥控器.

至于remote.<name>.skipDefaultUpdate设置,Git文档如此解释:

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

获取指定的一组遥控器

而不是获取所有遥控器,fetchremote update允许您指定多个遥控器和遥控器组来获取:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
Run Code Online (Sandbox Code Playgroud)

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

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup
Run Code Online (Sandbox Code Playgroud)

git fetch --multiple允许您指定多个存储库和存储库组,以便一次性获取(从文档中):

允许指定几个<repository><group>参数.不可以<refspec>s指定.

git remote update文档中含糊不清

所述用于概要git remote update指定该命令的语法如下:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]
Run Code Online (Sandbox Code Playgroud)

注意最后一部分,[(<group> | <remote>)…]?尾随点...意味着你可以用命令指定多个组和遥控器,这意味着它的行为方式与git fetch --multiple... 一样,看看两者之间的语法是如此相似?

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

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

所以目前还不清楚是否git remote updategit fetch --multiple指定多个单独的遥控器和多个远程组相同.

获取一个遥控器

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

git fetch <remote>
Run Code Online (Sandbox Code Playgroud)

可能是您也可以使用的情况

git remote update <remote>
Run Code Online (Sandbox Code Playgroud)

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

包起来

正如我所解释的,git fetch并且git remote update对于从多个遥控器获取同样的行为.它们共享类似的语法和参数,但是git fetch更短,所以人们可能会发现它更容易键入和使用.

可能是这样的情况,git remote update不能用于获取像这样的单个遥控器git fetch,但正如我已经指出的那样,文档并没有说明这一点.

在旁边

Git瓷器命令之间的功能重复,例如git fetchgit remote update以上,并不是唯一的.我已经注意到了类似的情况git rebase --onto,并git cherry-pick在既可以采取一系列的提交补丁到一个新的基地提交.

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

git cherry-pick学会了选择一系列提交(例如cherry-pick A..Bcherry-pick --stdin),也是如此git revert; 但是,这些不支持更好的测序控制rebase [-i].

  • 仅供参考:`git rebase`就像`mv`而``git cherry-pick`就像`cp`.`--onto`开关不会改变它.只有在指定SHA1值时才可以使用`git rebase`获得复制效果,否则您的分支将被移动! (4认同)