gitタグとは何か、タグを作成する方法、およびgitリモートタグをチェックアウトする方法


524

リモートgitタグをチェックアウトすると、次のようなコマンドが使用されます。

git checkout -b local_branch_name origin/remote_tag_name

次のようなエラーが発生しました:

error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.

git tagコマンドを使用すると、remote_tag_nameが見つかります。

回答:


1155

gitのタグが何であるかを説明することから始めましょう

ここに画像の説明を入力してください

タグは、履歴内の特定のコミットにラベルを付けてマークするために使用されます。
これは通常、リリースポイント(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:

cloneコマンドの使用

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

カンニングペーパー: ここに画像の説明を入力してください



3
いいね。git checkout A。なにA?どのように作成しましたAか?
2017年

3
@CodeWizard素敵なフローチャート!それを作成するためにどのソフトウェアを使用しましたか?
Giovanni Lovato 2017年

4
@Honey Aはコミットハッシュ
Alex Baklanov

2
@GiovanniLovatoフローチャートはサードパーティのものです。画像へのリンクはbacklog.com/git-tutorial/img/post/stepup/…です。これは、Git Beginner's Guide for Dummies(backlog .com)。
ジョージ

2
git checkout tags/<tag_name> -b <branch_name>が必要であることは注目に値し-b <branch_name>ます。git checkout tags/<tag_name>分離した頭をくれました。分離ヘッドに関するこの記事のように、ブランチを一時的に作成および削除することにより、分離ヘッドを回避します。これはかなり異質なワークフローです。明らかに私はgitユーザーとして、楽しさと利益のためにブランチの作成と削除に慣れる必要があります。
icc97 2018

194

(この回答を書くにはしばらく時間がかかりました。codeWizardの回答は、目的と本質においては正しいですが、完全ではないため、とにかく投稿します。)


「リモートGitタグ」などはありません。「タグ」のみあります。私はこれをすべて面倒ではないことを指摘します1が、これはカジュアルなGitユーザーとはかなり混乱しており、Gitのドキュメントは初心者にはあまり役に立ちません2。(ドキュメントが不十分なために混乱が発生したのか、それとも本質的にやや混乱しているために不十分なドキュメントが発生したのか、または何が原因なのかは明らかではありません。)

「リモートブランチ」、より正確には「リモートトラッキングブランチ」と呼ばれるものがあります、これらは実際にはローカルエンティティであることは注目に値します。ただし、リモートタグはありません(ユーザーが(再)発明しない限り)。ローカルタグしかないため、使用するにはローカルでタグを取得する必要があります。

特定のコミットの名前の一般的な形式(Gitが参照と呼ぶ)は、で始まる文字列refs/です。refs/heads/ブランチの名前で始まる文字列。refs/remotes/リモート追跡ブランチの名前で始まる文字列。refs/tags/タグで始まる文字列。名前refs/stashはスタッシュ参照です(によって使用されgit stashます。末尾にスラッシュがないことに注意してください)。

始まらない、いくつかの珍しい特殊なケースの名前がありますrefs/HEADORIG_HEADMERGE_HEAD、およびCHERRY_PICK_HEAD特に(かかわらず、特定のコミットを参照してもよいの名前もすべてありHEAD、通常は枝の名前、すなわち、含まれているが含まれていますが)。ただし、一般的に、参照はで始まります。ref: refs/heads/branchrefs/

Gitはこれが混乱にするために行います一つのことは、それは省略することができますということでrefs/、多くの場合、単語の後refs/。たとえば、あなたは、省略することができるrefs/heads/か、refs/tags/ローカルブランチやタグを参照するときに、実際にあなたがしなければならない省略refs/heads/ローカルブランチをチェックアウトしたときに!これは、結果がはっきりしているときはいつでも、または先ほど述べたように、実行する必要があるときは(の場合)実行できます。git checkout branch

参照が自分のリポジトリだけでなく、リモートリポジトリにも存在することは事実です。ただし、Gitを使用すると、非常に特定の時間、つまり操作中fetchおよびpush操作中にのみ、リモートリポジトリの参照にアクセスできます。また、使用することができますgit ls-remoteまたはgit remote showそれらを見ることが、fetchそしてpush接触のより興味深いポイントです。

Refspecs

期間中fetchpush、Gitは文字列を使用し、それを呼び出しrefspecsをローカルとリモートリポジトリ間の参照を転送します。したがって、2つのGitリポジトリが互いに同期できるのは、これらの時点で、refspecを介してです。名前が同期されると、リモートの誰かが使用するのと同じ名前を使用できます。fetchただし、ここには特別な魔法があり、ブランチ名とタグ名の両方に影響します。

git fetchGitに別の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/nametags/xyzzyxyzzyxyzzy$GIT_DIR$GIT_DIR/xyzzy*HEAD$GIT_DIR


1わかりました、わかりました、「知識を深めるだけではありません」。:-)

2一部の人は「非常に役に立たない」と言い、実際には同意する傾向があります。

3基本的にgit fetch、、およびリモートと参照仕様の全体的な概念は、Git 1.5の頃に起こったGitへの追加が少し遅れたものでした。それまでは、特別な特別なケースがいくつかあり、タグフェッチもその1つでした。そのため、特別なコードを介してこの方法が採用されました。

4それが役立つ場合は、リモートGitを俗語の意味でのフラッシャーと考えてください。


素晴らしい記事。1つの小さなnit:argがgit fetch指定されたリモートのタグのみをフェッチします--tags
c週

@cweekly:の行動--tags--no-tagsおよびデフォルトでは実際には非常にトリッキーです。デフォルトでは、持ち込んでいるコミットにある、持っていないタグを持ち込みます(2017年1月の編集を参照してください)。ただし、ここにも不具合があり、最新のGitには--tags / --no-tags処理コードが再び改訂されました。これにより、さらに特殊なコーナーケースが発生する可能性があります。
torek 2018年

1

gitタグをチェックアウトするには、次のコマンドを実行します

git checkout tags/tag-name -b branch-name

たとえば、以下のように。

 git checkout tags/v1.0 -b v1.0-branch

すべてのタグを取得するには、次のコマンドを使用します

git fetch --all --tags

0

特定のタグコードを取得するには、新しいブランチを作成して、その中にタグコードを追加します。私はそれをコマンドで実行しました:$git checkout -b newBranchName tagName

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.