回答:
タグは、履歴内の特定のコミットにラベルを付けてマークするために使用されます。
これは通常、リリースポイント(v1.0など)をマークするために使用されます。タグはブランチのように見えますが、タグは変わりません。これは、ポイントを直接に特定のコミット履歴に。
タグがローカルにない場合は、タグをチェックアウトできません。最初にfetch
、タグをローカルリポジトリに追加する必要があります。
まず、次のようにしてタグがローカルに存在することを確認します
# --all will fetch all the remotes.
# --tags will fetch all tags as well
$ git fetch --all --tags --prune
次に、実行してタグを確認します
$ git checkout tags/<tag_name> -b <branch_name>
接頭辞をorigin
使用する代わりにtags/
。
このサンプルには2つのタグバージョン1.0とバージョン1.1があり、次のいずれかでチェックアウトできます。
$ git checkout A ...
$ git checkout version 1.0 ...
$ git checkout tags/version 1.0 ...
タグは特定のコミットへのポインタに過ぎないため、上記のすべてが同じことを行います。
origin:https : //backlog.com/git-tutorial/img/post/stepup/capture_stepup4_1_1.png
# list all tags
$ git tag
# list all tags with given pattern ex: v-
$ git tag --list 'v-*'
タグを作成するには2つの方法があります。
# lightweight tag
$ git tag
# annotated tag
$ git tag -a
2つの違いは、注釈付きタグを作成するときに、git commitと同じようにメタデータ(
名前、電子メール、日付、コメント、署名) を追加できることです。
# delete any (local) given tag
$ git tag -d <tag name>
# Delete a tag from the server with push tags
$ git push --delete origin <tag name>
特定のタグのコンテンツを取得するには、checkout
コマンドを使用できます。上記で説明したように、タグは他のコミットと同様に使用できcheckout
、SHA-1を使用する代わりに、単純にtag_nameに置き換えます。
オプション1:
# Update the local git repo with the latest tags from all remotes
$ git fetch --all
# checkout the specific tag
$ git checkout tags/<tag> -b <branch>
オプション2:
gitはcloneコマンドにを追加することで浅いクローンをサポートするため--branch
、ブランチ名の代わりにタグ名を使用できます。Gitは、指定されたSHA-1を関連するコミットに「変換」する方法を知っています。
# Clone a specific tag name using git clone
$ git clone <url> --branch=<tag_name>
git clone --branch =
--branch
また、タグを取得して、結果のリポジトリのコミット時にHEADをデタッチできます。
git push --tags
すべてのタグをプッシュするには:
# Push all tags
$ git push --tags
refs/tags
だけを指定する代わりにを使用し<tagname>
ます。どうして?- refs/tags
時にはタグがブランチと同じ名前を持つことがあり、単純なgit pushがタグの代わりにブランチをプッシュするため、使用することをお勧めします
注釈付きタグと現在の履歴チェーンタグをプッシュするには、以下を使用します。
git push --follow-tags
このフラグは--follow-tags
両方のコミットと両方のタグのみをプッシュします。
Git 2.4から、設定を使用して設定できます
$ git config --global push.followTags true
A
はコミットハッシュ
git checkout tags/<tag_name> -b <branch_name>
が必要であることは注目に値し-b <branch_name>
ます。git checkout tags/<tag_name>
分離した頭をくれました。分離ヘッドに関するこの記事のように、ブランチを一時的に作成および削除することにより、分離ヘッドを回避します。これはかなり異質なワークフローです。明らかに私はgitユーザーとして、楽しさと利益のためにブランチの作成と削除に慣れる必要があります。
(この回答を書くにはしばらく時間がかかりました。codeWizardの回答は、目的と本質においては正しいですが、完全ではないため、とにかく投稿します。)
「リモートGitタグ」などはありません。「タグ」のみあります。私はこれをすべて面倒ではないことを指摘します1が、これはカジュアルなGitユーザーとはかなり混乱しており、Gitのドキュメントは初心者にはあまり役に立ちません2。(ドキュメントが不十分なために混乱が発生したのか、それとも本質的にやや混乱しているために不十分なドキュメントが発生したのか、または何が原因なのかは明らかではありません。)
「リモートブランチ」、より正確には「リモートトラッキングブランチ」と呼ばれるものがありますが、これらは実際にはローカルエンティティであることは注目に値します。ただし、リモートタグはありません(ユーザーが(再)発明しない限り)。ローカルタグしかないため、使用するにはローカルでタグを取得する必要があります。
特定のコミットの名前の一般的な形式(Gitが参照と呼ぶ)は、で始まる文字列refs/
です。refs/heads/
ブランチの名前で始まる文字列。refs/remotes/
リモート追跡ブランチの名前で始まる文字列。refs/tags/
タグで始まる文字列。名前refs/stash
はスタッシュ参照です(によって使用されgit stash
ます。末尾にスラッシュがないことに注意してください)。
始まらない、いくつかの珍しい特殊なケースの名前がありますrefs/
:HEAD
、ORIG_HEAD
、MERGE_HEAD
、およびCHERRY_PICK_HEAD
特に(かかわらず、特定のコミットを参照してもよいの名前もすべてありHEAD
、通常は枝の名前、すなわち、含まれているが含まれていますが)。ただし、一般的に、参照はで始まります。ref: refs/heads/branch
refs/
Gitはこれが混乱にするために行います一つのことは、それは省略することができますということでrefs/
、多くの場合、単語の後refs/
。たとえば、あなたは、省略することができるrefs/heads/
か、refs/tags/
ローカルブランチやタグを参照するときに、実際にあなたがしなければならない省略refs/heads/
ローカルブランチをチェックアウトしたときに!これは、結果がはっきりしているときはいつでも、または先ほど述べたように、実行する必要があるときは(の場合)実行できます。git checkout branch
参照が自分のリポジトリだけでなく、リモートリポジトリにも存在することは事実です。ただし、Gitを使用すると、非常に特定の時間、つまり操作中fetch
およびpush
操作中にのみ、リモートリポジトリの参照にアクセスできます。また、使用することができますgit ls-remote
またはgit remote show
それらを見ることが、fetch
そしてpush
接触のより興味深いポイントです。
期間中fetch
とpush
、Gitは文字列を使用し、それを呼び出しrefspecsをローカルとリモートリポジトリ間の参照を転送します。したがって、2つのGitリポジトリが互いに同期できるのは、これらの時点で、refspecを介してです。名前が同期されると、リモートの誰かが使用するのと同じ名前を使用できます。fetch
ただし、ここには特別な魔法があり、ブランチ名とタグ名の両方に影響します。
git fetch
Gitに別のGit(「リモート」)を呼び出し(またはおそらくテキストメッセージで)して、それと会話するように指示することを考える必要があります。この会話の早い段階で、リモートはそのすべての参照をリストします:内のすべてと内のすべて、refs/heads/
およびrefs/tags/
それが持っている他のすべての参照。Gitはこれらをスキャンし、(通常のフェッチrefspecに基づいて)ブランチの名前を変更します。
namedの通常のrefspecを見てみましょうorigin
:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
このrefspecは、すべての名前マッチング取るためにあなたのGitに指示refs/heads/*
-ieを、リモートおよびに社名を変更上のすべてのブランチrefs/remotes/origin/*
すなわち、(支店名を変更し、マッチした部分を同じに保つため、refs/heads/
(リモート追跡ブランチ名に)refs/remotes/
、特に、refs/remotes/origin/
)。
それは、このrefspecていることorigin
の枝は、リモートのためのあなたのリモート追跡の枝になりますorigin
。ブランチ名はリモート追跡ブランチ名になり、リモートの名前(この場合origin
は)が含まれます。+
refspecの前にあるプラス記号は「強制」フラグを設定します。つまり、リモートトラッキングブランチは、一致させるために必要なものに関係なく、リモートのブランチ名と一致するように更新されます。(がない場合+
、ブランチの更新は「早送り」の変更に限定され、タグの更新はGitバージョン1.8.2以降から無視されます。その前に、同じ早送りルールが適用されます。)
しかし、タグはどうですか?それらのrefspecはありません—少なくとも、デフォルトではありません。1つを設定できます。その場合、refspecの形式は自由です。または実行できますgit fetch --tags
。使用すると、--tags
追加の効果があるrefs/tags/*:refs/tags/*
すなわち、refspecには、それがすべてのタグの上にもたらします(しかし、更新されません。あなたがすでに、その名前のタグを持っている場合は、タグを関係なく、リモートのタグが言うの編集、2017年1月には:Gitの2.10のようテストでは--tags
、refspecが読み取るかのように、リモートのタグからタグを強制的に更新する+refs/tags/*:refs/tags/*
ことが示されています。これは、以前のバージョンのGitとは動作が異なる可能性があります)。
何もここに名前変更がないことを注意:リモート場合はorigin
タグを持っているxyzzy
、とあなたがいない、とあなたgit fetch origin "refs/tags/*:refs/tags/*"
、あなたが取得refs/tags/xyzzy
あなたのリポジトリに追加(同じを指すが、リモコンのようコミット)。を使用する+refs/tags/*:refs/tags/*
と、タグxyzzy
があれば、からのものに置き換えられorigin
ます。つまり+
、refspecの強制フラグは、「参照の値をGitがGitから取得した値で置き換える」ことを意味します。
歴史的な理由により、3はあなたがどちらを使用する場合--tags
のオプションも--no-tags
オプションを、git fetch
特別なアクションを実行します。上で述べたことを思い出してください。リモートは、ローカルGitが参照したいかどうかに関係なく、すべての参照をローカルGitに表示することから始まります。4 Gitは、この時点で表示されるすべてのタグをメモします。 次に、コミットするオブジェクトのダウンロードを開始するときに、フェッチするものをすべて処理する必要があります。これらのコミットのいずれかがこれらのタグのいずれかと同じIDを持つ場合、gitはそのタグ、または複数のタグにそのIDがある場合はそれらのタグを追加しますリポジトリ。
編集、2017年1月:自分のGitは名前のタグを提供している場合:Gitの2.10での動作が今であることをテストするショーTを、そしてあなたが名前のタグはありませんTを、そして関連付けられたコミットID Tはその分岐の1つの祖先でありますあなたのgit fetch
調べていること、あなたのGitはあなたのタグにTを追加します--tags
。追加する--tags
と、Gitはすべてのタグを取得し、強制的に更新します。
git fetch --tags
タグを取得するために使用する必要がある場合があります。自分のタグ名、既存のタグ名と競合する場合は、可能(Gitのバージョンによって異なります)であっても、削除(または名前の変更)のタグの一部を、次に実行する必要がありgit fetch --tags
、そのタグを取得するには、。リモートブランチとは異なり、タグには自動名前変更がないため、タグ名はタグ名と一致する必要があります。これが競合の問題が発生する理由です。
で最も、単純なものの、通常の場合、git fetch
彼らのコミットとそのマッチングタグの上にもたらし、仕事をする、と彼らは、誰でも、彼らはそれらのコミットを発行する時にコミットにタグ付けされていること-れるので、あなたはそれらのタグについていくでしょう。独自のタグを作成しない場合や、それらのリポジトリと他のリポジトリを(複数のリモート経由で)混在させない場合も、タグ名の衝突は発生しないため、タグを削除したり名前を変更したりする必要はありません。タグを取得します。
私はあなたが省略できることを前述したrefs/
と、ほぼ必ずrefs/heads/
とrefs/tags/
し、そのほとんどの時間に。しかし、いつできませんか?
完全な(とにかくほぼ完全な)答えは、gitrevisions
ドキュメントにあります。Gitは、リンクで指定された6ステップのシーケンスを使用して、名前をコミットIDに解決します。奇妙なことに、タグはブランチをオーバーライドします。タグxyzzy
とブランチxyzzy
があり、それらが異なるコミットを指している場合、次のようになります。
git rev-parse xyzzy
タグが指すIDを提供します。しかし、これは何から欠けているgitrevisions
- git checkout
、ブランチ名を好むので、git checkout xyzzy
タグを無視し、枝の上にあなたを配置します。
あいまいな場合は、ほとんどの場合、完全な名前refs/heads/xyzzy
またはを使用して参照名を綴ることができますrefs/tags/xyzzy
。(これはで動作しますgit checkout
が、おそらく予期しない方法で動作することに注意してください:git checkout refs/heads/xyzzy
ブランチのチェックアウトではなくデタッチされたHEADチェックアウトが発生します。これがgit checkout
、ブランチ名として最初にショートネームを使用することに注意する必要があるのはそのためです。xyzzy
タグxyzzy
が存在する場合でもブランチをチェックアウトしますrefs/tags/xyzzy
。タグをチェックアウトする場合は、を使用できます。)
(gitrevisions
メモとして)Gitはを試すので、タグを付けたコミットを特定するために単に書き込むこともできます。(誰かが名前の有効な参照書くことに成功した場合には、しかし、これは、解決されます。しかし、通常は唯一の様々な名前がでなければなりません。)refs/name
tags/xyzzy
xyzzy
xyzzy
$GIT_DIR
$GIT_DIR/xyzzy
*HEAD
$GIT_DIR
1わかりました、わかりました、「知識を深めるだけではありません」。:-)
2一部の人は「非常に役に立たない」と言い、実際には同意する傾向があります。
3基本的にgit fetch
、、およびリモートと参照仕様の全体的な概念は、Git 1.5の頃に起こったGitへの追加が少し遅れたものでした。それまでは、特別な特別なケースがいくつかあり、タグフェッチもその1つでした。そのため、特別なコードを介してこの方法が採用されました。
4それが役立つ場合は、リモートGitを俗語の意味でのフラッシャーと考えてください。
git fetch
指定されたリモートのタグのみをフェッチします--tags
。
--tags
、--no-tags
およびデフォルトでは実際には非常にトリッキーです。デフォルトでは、持ち込んでいるコミットにある、持っていないタグを持ち込みます(2017年1月の編集を参照してください)。ただし、ここにも不具合があり、最新のGitには--tags / --no-tags処理コードが再び改訂されました。これにより、さらに特殊なコーナーケースが発生する可能性があります。
git checkout A
。なにA
?どのように作成しましたA
か?