195

git remote updateと同等ですgit fetchか?

4

2 に答える 2

143

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

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

于 2009-12-06T20:29:21.927 に答える
127

更新: 詳細情報!

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

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

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

git fetch多くのリポジトリからフェッチを実行するための学習オプション--allと、古くなったリモート追跡ブランチを削除するオプション。これらはandの必要性を少なくします ( norを削除する予定はありませんが)。--multiple--prunegit remote updategit remote pruneremote 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.default、レポ構成で設定せず、リモートremote.<name>.skipDefaultUpdateがtrueに設定されていない.

Gitの構成に関する現在の 1.8.3.2 のドキュメントでは、この設定について言及されていませんremotes.defaultが、私はそれについて The Almighty 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はない場合、リポジトリが「認識」しているすべてのリモートを取得することはありません。

remote.<name>.skipDefaultUpdate設定に関しては、Git docsで次のように説明されています。

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 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指摘したように、ドキュメントではこれが明確にされていません。

さておき

git fetch上記のとで例示されている Git 磁器コマンド間の機能の重複は、git remote update固有のものではありません。git rebase --ontoとで同様の状況に気付きました。git cherry-pickどちらも、新しいベース コミットにパッチを適用するためにさまざまなコミットを行うことができるという点です。

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

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

于 2013-07-07T12:06:32.587 に答える