web-dev-qa-db-ja.com

gitリモートアップデートとフェッチの違いは?

git remote updategit fetchと同等ですか?

171
David

更新:詳細情報!

最初からこれを行う必要がありました: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に移行しています)。currentgit remote update および git fetch のドキュメント、それらは両方が新しいコミットをフェッチする基本的に同じ機能を実行できるように見えます複数のリモート、正しいオプションと引数を指定します。

すべてのリモートを取得する

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

git fetch --all

remote.<name>.skipFetchAllが設定されていない場合、これは設定されたすべてのリモートから取得します。

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

これは、使用するのと同等です

git remote update

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

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 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>で定義されているように、リポジトリ内のリモートの名前付きセットのFetch [es]更新。

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

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

最後に、誰もが単一のリモートを取得する簡単なケースを知っています。

git fetch <remote>

あなたも使用できる場合があります

git remote update <remote>

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

要約

説明したように、git fetchgit remote updateは、複数のリモートからのフェッチに関して同様に動作します。 git fetchはより短いので、それらは同様の構文と引数を共有します。

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

余談

上記のgit fetchgit remote updateで例示されているGit磁器コマンド間の機能の重複は一意ではありません。 git rebase --ontogit cherry-pick で同様の状況に気付きました。両方が新しいベースコミットにパッチを当てるために一定範囲のコミットを取ることができます。

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

git cherry-pickは、ある範囲のコミット(cherry-pick A..Bcherry-pick --stdinなど)を選択することを学びました。したがって、git revertも同様です。ただし、これらは、rebase [-i]が持つ優れたシーケンス制御をサポートしていません。

101
user456814

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

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

141
xenoterracide