git remote updateとfetchの違いは?


回答:


112

更新:詳細!

私は最初からこれを行うべきでした:GitのGitリポジトリにGitリリースノートをgrepしました(とてもメタです!)

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

次に、をless検索しました--all。これは、Gitバージョン1.6.6のリリースノートで見つけたものです。

git fetch多くのリポジトリからフェッチを実行するための学習--all--multipleオプション、および--prune古くなったリモート追跡ブランチを削除するためのオプション。これらのメイクgit remote updategit remote pruneあまり必要(削除する予定はありませんremote updateremote pruneかかわらず、)。

バージョン1.6.6は2009年12月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、正しいオプションと引数を指定すると、どちらも基本的に、複数のリモートから新しいコミットを取得する同じ機能を実行できます。

すべてのリモコンを取得しています

複数のリモートを取得する1つの方法は、--allフラグを使用することです。

git fetch --all

設定していない場合は、設定済みのすべてのリモートからフェッチremote.<name>.skipFetchAllします。

trueの場合、git-fetch(1)またはgit-remote(1)の updateサブコマンドを使用して更新するときに、このリモートはデフォルトでスキップされます。— git-configドキュメント

これは、

git remote update

フェッチするリモートグループを指定せず、またremotes.defaultrepo構成で設定していないこと、およびどのリモートもremote.<name>.skipDefaultUpdatetrueに設定していないこと。

Gitリポジトリの構成の現在の1.8.3.2ドキュメントは言及していないremotes.default設定を、私はそれについて全能Googleに相談してから、この便利な説明を見つけMislavMarohnićを

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

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

remote updateコマンドによってフェッチされるリモートのデフォルトリストを定義できます。これらは、チームメイトからのリモート、オープンソースプロジェクトの信頼できるコミュニティメンバーなどです。

したがって、おそらくremotes.default設定していて、その中にすべてのリモートがリストされてgit remote updateいない場合は、リポジトリが「認識」しているすべてのリモートをフェッチしないでしょう。

用としてremote.<name>.skipDefaultUpdate設定、Gitのドキュメントは thuslyそれを説明します:

trueの場合、git-fetch(1)またはgit-remote(1)の updateサブコマンドを使用して更新するときに、このリモートはデフォルトでスキップされます。

リモートの指定されたグループを取得する

すべてのリモートをフェッチする代わりに、両方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いくつかのリポジトリとリポジトリグループを指定して、一度にフェッチすることができます(docsから):

いくつかの許可<repository><group>引数を指定します。<refspec>s指定できません。

git remote updateドキュメントのあいまいさ

概要はgit remote update、コマンド構文が次のとおりであること指定します。

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

最後の部分に注意してください[(<group> | <remote>)…]?末尾のドット...は、コマンドを使用して複数のグループとリモートを指定できることを意味します。つまりgit fetch --multiple、2つのグループの構文が同じように動作することを意味します。

ただし、同じドキュメントでは、updateコマンドの説明では、複数のグループとリモートの引数を指定することについては何も述べられていません。

で定義されているように、リポジトリ内の名前付きリモートセットの更新をフェッチします。 remotes.<group>いる。

だからかどうかは不明です git remote updategit fetch --multiple複数の個別のリモートと複数のリモートグループを指定することに関してと同じ機能する。

単一のリモートを取得する

最後に、誰もが単一のリモートをフェッチする単純なケースを知っています。

git fetch <remote>

あなたも使用できる場合があるかもしれません

git remote update <remote>

同じことをしますが、前のセクションで述べたようにgit remote update、単一のグループ以外のものをフェッチできるかどうかについてのドキュメントは不明確です、コマンドを使用してリモートのです。

要約

私が説明git fetchしたgit remote updateように、複数のリモートからのフェッチに関して同様に動作します。ただし、それらは同様の構文と引数を共有します。git fetch短いが。そのため、タイプして使用する方が簡単だと思います。

git remote updatewithのように単一のリモートだけをフェッチするのに使用できない場合があるかもしれませんgit fetchが、私が指摘したように、ドキュメントではこれが明確にされていません。

さておき

例示Gitの磁器コマンドとの間の機能的に重複、git fetchおよびgit remote update上方には、一意ではありません。私は似たような状況に気づいたgit rebase --ontoし、git cherry-pick新しいベースがコミットに両方のパッチをコミットの範囲を取ることができるには、。

Gitが長年にわたって進化してきたため、おそらくエンドユーザーの便宜のために、一部の機能が(必然的に?)複製されたと思います(たとえば、cherry-pick単一のコミットを何度も渡すよりも、範囲をに渡す方が簡単です)範囲を選択します)。どうやらv1.7.2リリースノートでcherry-pick説明されているように、コミットの範囲を常に受け​​入れるとは限りませんでした:

git cherry-pickコミットの範囲を選択することを学びました(例:cherry-pick A..Bおよびcherry-pick --stdingit revertrebase [-i]ただし、これらはより優れたシーケンス制御をサポートしていません。


4
FYI:git rebaseのようなものであるmvgit cherry-pickのようなものですcp--ontoスイッチは、それを変更しません。git rebaseSHA1値を指定した場合にのみ、コピー効果を得ることができます。それ以外の場合、ブランチは移動されます。
Robert Siemer、2015

141

はいといいえ。git remote update1つだけでなく、すべてのリモートからフェッチします。

remote update単にシェルスクリプト(可能性がある)であるかどうかを確認するためにコードを調べることなく、基本的に、各リモートに対してフェッチを実行します。git fetchより細かくすることができます。


3
実行時にフェッチするgit remote updateリモートを設定できます。git-remoteのマンページを参照してください。
JakubNarębski、2009

ちなみに、git remoteはシェルスクリプトではありませんが、git fetch中に生成されますremote update
mipadi 2009

1
に相当するgit fetchコマンドオプションはありgit remote updateますか?
チューラー2012年

15
@tulerはい:それはgit fetch --all
LoKi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.