現在使用しているgitタグを表示しますか?


216

現在チェックアウトされているタグを見つけられません。

私がする時:

git checkout tag1
git branch

どのタグを付けているのかわかりません。ログするだけです:

* (no branch)
master

チェックアウトされているタグを見つけることはできますか?上記の例では、これはになりますtag1

回答:


326

編集:JakubNarębskiはもっとgit-fuを持っています。次のはるかに単純なコマンドは完全に機能します。

git describe --tags

(または--tags、注釈付きタグをチェックアウトした場合は、なし。私のタグは軽量なので、-tagsが必要です。)

元の答えは次のとおりです:

git describe --exact-match --tags $(git log -n1 --pretty='%h')

もっとgit-fuを持っている人はよりエレガントな解決策を持っているかもしれません...

これは、git-logチェックアウトしたものからログを報告するという事実を利用します。%h省略されたハッシュを出力します。次にgit describe --exact-match --tags、そのコミットと完全に一致するタグ(軽量または注釈付き)を見つけます。

上記の$()構文は、bashなどを使用していることを前提としています。


22
ただ、使用することはgit describe、あなたが(注釈付き)タグ、または上に正確である場合にタグ名を示すだろう<tag>-<n>-g<shortened sha-1>そうでない場合は、<n>コミットの数があるためです<tag>
JakubNarębski10年

1
@Jakub-ありがとう。--exact-matchコメントの数秒前に回答を追加しました。それを削除しても、あいまいな入力から適切な情報を取得できることを知ってうれしいです。
bstpierre

おかげで、これはまさに私が探していたものでした。ところで、git-describe --exact-match(--tagsなし)でも機能します。
grm

3
を使用することgit rev-parse HEADgit log -n1 --pretty='%h'... よりも優れたソリューションですが、なぜ単純にHEAD(またはgit describeデフォルトでHEAD として何も)記述できないのですか?
JakubNarębski10年

唯一Guybrush嫌い磁器
vdegenne

71

これは私のために働いた git describe --tags --abbrev=0


2
はい。これは、そのタグを正確に使用していなくても機能します。:)
Martin Muzatk​​o

13
ああ。...タグの後ろの3つのコミットのハッシュをチェックアウトする場合、「そのタグ上」ではありません。チェックアウトされる前またはコミット時の最後のタグを通知します。したがって、これは正しくありません。
ingyhere

Windowsでも動作します:)
カウリネーター

49

現在のHEADのすべてのタグを表示(またはコミット)

git tag --points-at HEAD

1
結果が空になっても、このコマンドはコマンドラインでエラーを報告しないことに注意してください。バグ?その場所に複数のタグがある場合は、リストも返します。これが最良の答えですが、スクリプト作成者はこれらの警告を念頭に置いて注意して続行する必要があります。
ingyhere

@ingyhereのコメントに続きます。はい、それはエラーがないことは良い情報であり、人々はそれに応じて結果を処理する必要があります。しかし、私はそれをバグとは呼びません。私の場合、「タグがない場合は空」が有効です。その他の場合、誰かがそれを変数に保存してから、それが空であるかどうか
ドリフトキャッチャー

23

git describeある磁器のあなたは避けなければならないコマンドは、:

http://git-blame.blogspot.com/2013/06/checking-current-branch-programatically.html

代わりに、私は使用しました:

git name-rev --tags --name-only $(git rev-parse HEAD)

11
「未定義」を返します
ストレンジャー

4
これ^0は、タグに対応するコミットの末尾を出力します(たとえば、タグ1.0が出力する場合1.0^0)。Gitのみを出力する方法はありますか1.0、またはこれにsedを使用する必要がありますか?
Daniel Serodio

13
ほんの一部の概念的な抜き取り:磁器と配管の意味を逆にしたと思います。磁器を使用しても問題ありません。高レベルであり、通常の使用を目的としています。配管は内部(名前が示すとおり)であり、git開発者は警告なしに引数と出力を変更する権利を留保するため、推奨されません。したがって、最初の提案は、実際には少し適切な提案です。
Leo Antunes

5
リンク先の記事では、「gitブランチ」はこのユースケースでは機能しないため、使用しないようにしています。git describeを使用しないようにする理由は考えられません。レオが言うように、「磁器」コマンドは、一般的に使用することになっているコマンドです。何をしているのか本当に理解していない限り、配管コマンドは避けてください。「git describe」はうまく機能します。
ダニー

4
「磁器」コマンドは、使用すべきものであり、回避すべきものではありません。それらは出力が機械可読であり、将来のバージョンで変更されないコマンドであるため、スクリプトなどで信頼できます。非磁器のコマンドは、より人間が読める出力を生成する傾向がありますが、たとえばより多くのようにするために、将来のバージョンで変更される可能性があります重要な何かが実際に変更されたからではなく、読みやすいです。
rjmunro 2017年

22

タグをチェックアウトすると、「切り離されたヘッド」と呼ばれるものが得られます。通常、GitのHEADコミットは、現在チェックアウトしているブランチへのポインターです。ただし、ローカルブランチ以外のもの(タグやリモートブランチなど)をチェックアウトすると、「切り離されたヘッド」が存在します-実際にはどのブランチにもいません。デタッチされたヘッド上では、コミットを行わないでください。

編集したくない場合は、タグをチェックアウトしても問題ありません。ファイルの内容を調べるだけの場合、またはタグからプロジェクトをビルドする場合は、コミットを行わない限りgit checkout my_tag、ファイルを操作してもかまいません。ファイルの変更を開始する場合は、タグに基づいてブランチを作成する必要があります。

$ git checkout -b my_tag_branch my_tag

my_tag_branchから始まる新しいブランチを作成しますmy_tag。このブランチの変更をコミットしても安全です。


1
素晴らしい答え。
Panos Filianos

9

git log --decorate

これにより、現在チェックアウトされているコミットを参照している参照がわかります。

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