web-dev-qa-db-ja.com

「git fetch --tags」には「git fetch」が含まれますか?

素晴らしく簡単な質問-「git fetch」の機能はgit fetch --tagsの厳密なサブセットですか?

つまりgit fetch --tagsを実行する場合、すぐにgit fetchをすぐに実行する理由はありますか?

git pullgit pull --tagsはどうですか?同じ状況?

243
davidA

注:この回答はgit v1.8以前でのみ有効です。

このほとんどは他の回答とコメントで述べられていますが、ここでは簡潔な説明があります。

  • git fetchは、すべてのブランチヘッド(またはremote.fetch configオプションで指定されたすべて)、それらに必要なすべてのコミット、およびこれらのブランチから到達可能なすべてのタグをフェッチします。ほとんどの場合、すべてのタグはこの方法で到達可能です。
  • git fetch --tagsは、すべてのタグ、およびそれらに必要なすべてのコミットをフェッチします。フェッチされたタグから到達可能であっても、ブランチヘッドをnot更新します。

概要:フェッチのみを使用して完全に最新にしたい場合は、両方を実行する必要があります。

また、コマンドラインで入力するという意味でない限り、「2倍遅い」ことはありません。その場合、エイリアスは問題を解決します。 2つの要求は異なる情報を要求しているため、2つの要求を行う際にオーバーヘッドは本質的にありません。

130
Cascabel

私は自分でこれに答えるつもりです。

違いがあると判断しました。 「git fetch --tags」はすべてのタグを取り込む可能性がありますが、新しいコミットは取り込みません。

完全に「最新」にするには、これを行う必要があることがわかります。つまり、マージせずに「git pull」を複製します。

$ git fetch --tags
$ git fetch

これは2倍遅いので残念です。 「git fetch」だけが通常行うことを行うオプションを持っていた場合andすべてのタグを取り込みます。

48
davidA

ここでの一般的な問題は、git fetch+refs/heads/*:refs/remotes/$remote/*をフェッチすることです。これらのコミットのいずれかにタグがある場合、それらのタグも取得されます。ただし、リモートのブランチから到達できないタグがある場合、それらは取得されません。

--tagsオプションは、refspecを+refs/tags/*:refs/tags/*に切り替えます。 couldgit fetchに両方を取得するように依頼します。次のコマンドを使用するgit fetch && git fetch -tを実行するだけで十分です。

git fetch Origin "+refs/heads/*:refs/remotes/Origin/*" "+refs/tags/*:refs/tags/*"

そして、これをこのレポジトリのデフォルトにしたい場合は、2番目のrefspecをデフォルトフェッチに追加できます。

git config --local --add remote.Origin.fetch "+refs/tags/*:refs/tags/*"

これにより、このリモートのfetch =に2番目の.git/config行が追加されます。


プロジェクトでこれを処理する方法を探していました。これが私が思いついたものです。

git fetch -fup Origin "+refs/*:refs/*"

私の場合、これらの機能が欲しかった

  • リモートからすべてのヘッドとタグを取得するため、refspec refs/*:refs/*を使用します
  • Refspecの前にローカルブランチとタグを非早送り+で上書きします
  • 必要に応じて、現在チェックアウトされているブランチを上書きします-u
  • リモート-pに存在しないブランチとタグを削除します
  • そして、必ず-f
31
gnarf

ほとんどの場合、git fetchは必要な処理を行う必要があります。つまり、「リモートリポジトリから新しいものをすべて取得し、ローカルブランチにマージせずにローカルコピーに配置します」。 git fetch --tagsはそれを正確に行いますが、新しいタグ以外は何も取得しません。

その意味で、git fetch --tagsgit fetchのスーパーセットではありません。実際にはまったく逆です。

git pullは、もちろんgit fetch <thisrefspec>; git mergeのラッパーにすぎません。そもそもgit fetchが何をしているのかを理解するのに役立つので、git mergeにジャンプする前に、手動でgit pullingとgit pullingに慣れることをお勧めします。

つまり、関係はgit fetchとまったく同じです。 git pullgit pull --tagsのスーパーセットです。

10
Tim Visher
git fetch upstream --tags

正常に機能し、新しいタグのみを取得し、他のコードベースは取得しません。

1
PAnand