“ git fetch --tags” include“ git fetch&#8221 ;?
質問
素晴らしく簡単な質問-「git fetch」の機能です; git fetch --tags
?
つまり git fetch --tags
を実行した場合、すぐに git fetch
をすぐに実行する理由はありますか?
git pull
と git pull --tags
はどうですか?同じ状況ですか?
解決
注: git 1.9 / 2.0で始まる(2014年第1四半期)、 git fetch --tags
は、オプションなしで同じコマンドラインによってフェッチされるものに加えて、 タグをフェッチします。
以前は、フェッチの"
-tags
"オプションはrefspecの指定と同等と見なされましたコマンドラインでrefs/tags/*:refs/tags/*
; 特に、
remote。< name> .refspec
構成は無視されました。しかし、他の参照を取得せずにタグを取得することはあまり有用ではありませんが、他の参照に加えて タグを取得できることは 非常に便利です。< br> そのため、このオプションのセマンティクスを変更して後者を実行します。
ユーザーが only タグを取得したい場合、明示的なrefspecを指定することも可能です:
git fetch <remote> 'refs/tags/*:refs/tags/*'
&quot;
fetch --tags
&quot;のこの側面については、1.8.0.3以前のドキュメントがあいまいだったことに注意してください。動作。
f0cb2f1をコミット(2012-12-14)fetch --tags
ドキュメントを古い動作に一致させました。
このコミットにより、新しい動作に合わせてドキュメントが変更されます(Documentation / fetch-options.txt
)。すべてのタグをリモートから取得するようにリクエストする他に取得するものに加えて。
Git 2.5(2015年第2四半期)以降、 git pull --tags
はより堅牢です:
pyokagan
)、2015年5月13日。
( C浜野潤夫- gitster
-が commit cc77b99 、2015年5月22日)
pull
:マージ候補がない場合の-tags
エラーの削除441ed41 (&quot;
git pull --tags
&quot ;:より良いメッセージでエラー出力。 2007-12-28、Git 1.5.4 +)、git pull --tags
は次の場合に異なるエラーメッセージを出力しますgit-fetch
はマージ候補を返しませんでした:It doesn't make sense to pull all tags; you probably meant: git fetch --tags
これは、その時点で
git-fetch --tags
がすべてをオーバーライドするためです refspecsを構成したため、マージ候補はありません。このため、混乱を防ぐためにエラーメッセージが導入されました。ただし、 c5a84e9 (
fetch --tags
:に加えてタグをフェッチします その他のもの、2013-10-30、Git 1.9.0 +)、git fetch --tags
はさらにタグを取得します 設定済みのrefspecsへ。
したがって、マージ候補がない場合は、-tags
が設定されているためではありません。そのため、この特別なエラーメッセージは無関係になりました。混乱を防ぐため、このエラーメッセージを削除してください。
Git 2.11以降(2016年第4四半期) git fetch
はより高速です。
他のヒント
注:この回答はgit v1.8以前でのみ有効です。
これのほとんどは他の回答やコメントで述べられていますが、ここに簡潔な説明があります:
-
git fetch
は、すべてのブランチヘッド(またはremote.fetch configオプションで指定されたすべて)、それらに必要なすべてのコミット、およびこれらのブランチから到達可能なすべてのタグをフェッチします。ほとんどの場合、すべてのタグはこの方法で到達可能です。 -
git fetch --tags
は、すべてのタグ、それらに必要なすべてのコミットをフェッチします。ブランチヘッドが取得されたタグから到達可能であったとしても、 更新されません。
概要:フェッチのみを使用して完全に最新にしたい場合は、両方を実行する必要があります。
「低速の2倍」でもありませんコマンドラインでの入力という意味ではない限り、エイリアスは問題を解決します。 2つのリクエストは異なる情報を要求しているため、2つのリクエストを行う際にオーバーヘッドは本質的にありません。
これに自分で答えます。
違いがあると判断しました。 &git; git fetch --tags&quot;すべてのタグを取り込むことができますが、新しいコミットは取り込みません!
これは、完全に「最新」に、つまり「git pull」を複製するためにこれを行う必要があることを確認します。マージなし:
$ git fetch --tags
$ git fetch
これは2倍遅いので残念です。 &quot; git fetch&quot;のみの場合通常行うことを行うオプションがあり、 すべてのタグを取り込みます。
ここでの一般的な問題は、 git fetch
が + refs / heads / *:refs / remotes / $ remote / *
をフェッチすることです。これらのコミットのいずれかにタグがある場合、それらのタグも取得されます。ただし、リモートのブランチから到達できないタグがある場合、それらは取得されません。
-tags
オプションは、refspecを + refs / tags / *:refs / tags / *
に切り替えます。両方を取得するように git fetch
にできます。 git fetch&amp;&amp;を実行するだけです。 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/*"
これにより、このリモートの .git / config
に2番目の fetch =
行が追加されます。
プロジェクトでこれを処理する方法を探していました。これが私が思いついたものです。
git fetch -fup origin "+refs/*:refs/*"
私の場合、これらの機能が欲しかった
- リモートからすべてのヘッドとタグを取得するため、refspec
refs / *:refs / *
を使用します
- ローカルブランチとタグを、refspecの前に非早送り
+
で上書きします - 必要に応じて現在チェックアウトされているブランチを上書きする
-u
- リモートの
-p
に存在しないブランチとタグを削除します
- 強制的に
-f
を確認する
ほとんどの場合、 git fetch
は、「リモートリポジトリから新しいものを取得し、ローカルブランチにマージせずにローカルコピーに配置する」という目的を果たす必要があります。 git fetch --tags
は、新しいタグ以外のものを取得しないことを除いて、まさにそれを行います。
その意味では、 git fetch --tags
は決して git fetch
のスーパーセットではありません。実際はまったく逆です。
git pull
は、もちろん、 git fetch&lt; thisrefspec&gt ;;のラッパーです。 git merge
。 git pull
にジャンプする前に、手動で git fetch
ingおよび git merge
ingを行うことに慣れることをお勧めします。最初に git pull
が何をしているのかを理解してください。
とはいえ、関係は git fetch
とまったく同じです。 git pull
は、 git pull --tags
のスーパーセットです。
git fetch upstream --tags
正常に動作します。新しいタグのみが取得され、他のコードベースは取得されません。