Gitの現在のブランチで最新のタグ名を取得するにはどうすればよいですか?


462

Gitで最新のタグを取得する最も簡単な方法は何ですか?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

出力:

a
b
c

各タグの日時を取得してそれらを比較するスクリプトを作成する必要がありますか?


1
最後に作成されたタグまたはコミット日付順に並べられた最新のタグ?承認された回答には、最後に作成されたタグが表示されます。これは、既存のタグを変更することを決定した場合に問題になる可能性があります...
Paebbels

回答:


412

を見てみgit describeましょう。これは、あなたが求めていることに近いものを実行します。


194
これにより--abbrev=0、最も近い注釈付きタグが返されます
JakubNarębski'09 / 09/10

13
現在のブランチの
brittohalloran 2011

42
現在のブランチの現在のコミットのみを対象とする最新の注釈付きタグを取得する、を使用しますgit describe --exact-match --abbrev=0
Naftuli Kay 2012

5
この回答はコメント付きで、正しいタグを提供してくれませんでした。@kilianicは正しいソリューションを提供しました。
Herman J. Radtke III 2012

20
git describe --tagsそしてgithubリリースページのcom最後のタグを比較します
Adriano Resende

627

最新のタグを取得するには:

git describe --tags

最新の注釈付きタグを取得するには:

git describe --abbrev=0

2
うん、のためのmanページがgit describe言うように --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
Giorgos Kylafas '28年

22
または単にgit describe --tags
james_womack

5
2つのタグが同じコミットを指している場合、この回答(およびおそらく他の回答)は問題が発生します。タグが注釈付きのタグでない限り、gitが2つのうちどちらが以前に作成されたかを区別する方法はないと思います。
ポールリンチ

10
これは受け入れられる答えになるはずです。送信いただきありがとうございます。
crmpicco 14

6
最新のタグを直接チェックアウトする場合:git checkout $(git describe --abbrev=0 --tags)
JohnRDOrazio '26

321

すべてのブランチにわたって最新のタグ付きコミットのタグを出力します

git describe --tags $(git rev-list --tags --max-count=1)

8
またはTAG=$(git describe --tags $(git rev-list --tags --max-count=1))@ william-pursell
kilianc

20
これが最良の答えです。現在の「正しい」答えのように、現在のブランチだけでなく、すべてのブランチにわたって実際にタグを取得します。
brittohalloran

61
現在のブランチを具体的に尋ねる質問を除きます。
michaeltwofish 2012年

3
@michaeltwofish、私がそれを知らなかったときに、私は後でそれを理解し、それに応じて私の答えを修正しました。申し訳ありません。
kilianc 2012年

3
注:このタグが別のブランチにある場合でも、このコマンドは「最新」のタグを返します。
Alan Zhiliang Feng 2015

47

最新のタグを取得するには、次のようにします。

$ git for-each-ref refs / tags --sort = -taggerdate --format = '%(refname)' --count = 1

もちろん、必要に応じてcount引数またはsortフィールドを変更できます。少し違う質問をするつもりだったようですが、私が解釈すると、これは質問の答えになります。


2
これは私が(すべてのブランチ間で最も最近のタグ)を探していたものをほぼ正確であるが、少なくとも、gitの私のバージョン(1.7.7.6)でタグが両方に同じ順序で生産されている--sort=-authordate--sort=authordate
ラスク

3
ああ、あなたが実際に欲しいのはだからです--sort=-taggerdate。タグの場合authordatecommitterdate空です(したがって、ソートキーとしては役に立ちません)。
ラスク

8
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1より良いです:)
クリストフ・エブレ2015年

5
本当に、コメントなしで5年近く前の完全に正しい答えに反対票を投じるのですか?それは失礼です。
William Pursell

1
そして--points-at=$SHA、コミットハッシュのタグを提供します。
Ryan

35

これはどう?

TAG=$(git describe $(git rev-list --tags --max-count=1))

技術的には、必ずしも最新のタグを取得するわけではありませんが、タグ付けされている最新のコミットを取得します。


これは、現在のブランチではなく、すべてのブランチで最新のタグを取得しません。それは素晴らしいです。なぜなら、それがまさに私が必要としたものだからです。Wincentに感謝します。
jasongregori 2014

2
あなたがタグマッチングパターンを取得する必要がある場合は使用することができます--tags=<pattern>の中でrev-list。たとえば、最新バージョンのタグを取得git describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
Wirone

1
$(git describe --contains $(git rev-parse HEAD))
Vaidas Zilionis

おかげでうまくいきましたが、-tagsを追加する必要がありました git describe --tags $(git rev-list --tags --max-count=1)
Gianluca Casati

25

あなたは実行することができgit describe --tags $(git rev-list --tags --max-count=1)ます:ここで話しました:最新のタグ名を取得する方法?


私はトップ/受け入れられた答えから始めて、自分の道を進んでいきました。これは実際に私に最新のタグを与える最初の答えです(理由はわかりませんが、プレーンオールドgit describe ...は以前のタグを返します!)
Jeremy Davis

これは私のために働く唯一のものです。いくつかの--abbrev=0回答を試しましたが、彼らは私が欲しいタグの一部を切り取りました。
ルークデイビス

22

「最新」には、gitに関して2つの意味があります。

「どのタグに作成日が最も遅いか」ということで、ここでの答えのほとんどはその質問に対するものです。あなたの質問の点では、あなたはタグを返したいでしょうc

または、「どのタグが開発履歴で名前付きブランチに最も近いか」、通常は自分がいるブランチを意味するかもしれませんHEAD。あなたの質問では、これはtagを返しaます。

もちろん、これらは異なる場合があります。

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

月曜日にタグが付けられ、火曜日にタグが付けZられた開発者を想像してください。 はより最近ですが、開発履歴ではHEADに近いパスから始まります。v0.2Qv0.1v0.1v0.2

私は通常、開発の歴史により近いこの2番目の答えを求めていると思います。git log v0.2..HEADタグごとにetcを使用することでそれを見つけることができます。これによりv0.2、パスがHEADが続くパスから分岐して終了するため、HEADでのコミット数がわかります。

次のPythonスクリプトは、このチェックを実行するすべてのタグを繰り返し処理し、タグパスが分岐してからHEADでのコミットが最も少ないタグを出力します。

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describeHEADから履歴に戻ってパス上にある最初のタグを見つけるために(たとえば)HEADから逆に追跡するという点で、少し異なることを行います。git用語でgit describeは、HEADから「到達可能」なタグを探します。したがって、このようなタグv0.2は、HEADから戻るパスではなく、そこから分岐したパスにはありません。


21

git describe --tags

現在のブランチで見ることができる最後のタグを返します


15
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

最後のタグが複数必要な場合

(git describe --tagsが間違ったハッシュを返すことがありますが、理由はわかりませんが、私にとって--max-count 2は機能しません)

これは、最新の2つのタグ名のリストを新しい順に取得する方法です。git1.8.4で完全に動作します。以前のバージョンのgit(1.7。*など)では、出力に「tag:」文字列はありません-最後のsed呼び出しを削除するだけです

2つ以上の最新のタグが必要な場合-この「sed 2q」を「sed 5q」または必要なものに変更します

その後、すべてのタグ名を変数などに簡単に解析できます。


これは非常に役立ちます。多くの開発者は、展開が失敗した場合に前のタグにロールバックすることでリリースプロセスを自動化しようとします。すごいもの!!!
AkD 2014

1
これをさらに進めるために: git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p' ここで、in %Dは周囲の()文字を除外し、sed5qで始まるsは5の前に4行を残し、次に 'tag: `と最初の'、 'の間のすべての文字を出力します。したがって、タグ内でコンマが使用されていないと仮定すると、これは完全に機能します。
Cometsong

14

すべての提案の何が問題になっていますか(Matthew Brettの説明、この回答投稿の最新のものを除く)?

履歴の別のポイントで他の人が提供したコマンドをjQuery Git履歴で実行し、視覚的なタグ付け履歴表現で結果を確認するだけです(私がそうしたのがこの投稿を表示する理由です)。

$ git log --graph --all --decorate --oneline --simplify-by-decoration

今日、多くのプロジェクトはmainlineとは別のブランチでリリース(およびタグ付け)実行しています

これには大きな理由があります。十分に確立されたJS / CSSプロジェクトを見てください。ユーザー規約では、DVCSでバイナリ/縮小リリースファイルを保持しています。当然のことながら、プロジェクトのメンテナとしてあなたはゴミにあなたのメインラインたくない差分役に立たないバイナリ・ブロブと歴史を、ビルド成果物のコミットを実行メインラインの外へ

Gitは線形履歴ではなくDAGを使用するため、距離メトリックを定義するの難しい ため、次のように言うことができますHEAD

私は自分の旅を始めます(中を見て、私はこの長い投稿に派手な証明画像をコピーしませんでした):

Gitでの分岐に関して、過去の最も近いタグは何ですか?

現在、私はタグとリビジョンの間の距離の4つの合理的な定義を持っています。

  • 最短経路の長さからHEADマージベースタグと
  • とタグの間のベースマージの日付HEAD
  • HEADから到達可能であるがタグからは到達できない回転数
  • マージベースに関係なくタグの日付

最短経路の長さを計算する方法がわかりません。

タグとタグの間のマージベースの日付に従ってタグをソートするスクリプト :HEAD

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

ほとんどのプロジェクトで使用できます。

HEADからは到達可能であるがタグからは到達できない回転数に従ってタグをソートするスクリプト:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

プロジェクトの履歴がコミット時に奇妙な日付を持っている場合(リベースまたは別の履歴の書き換え、または一部のmoronがBIOSバッテリーの交換を忘れたり、履歴で行ったその他の魔法のため)、上記のスクリプトを使用します。

日付でソートされたタグのリストを取得する最後のオプション(マージベースに関係なくタグの日付)の場合:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

既知の現在の改訂日を取得するには、以下を使用します。

$ git log --max-count=1

git describe --tags独自のケースで使用法がありますが、プロジェクト履歴で人間が期待する最も近いタグを見つけるためではありません。

上記のレシピはどのリビジョンでも使用できHEADます。必要なものに置き換えてください。


12

git describe --abbrev=0 --tags

最新のタグが表示されない場合は、それを実行する前にoriginをフェッチしていることを確認してください:

git remote update


12
git tag -l ac* | tail -n1

接頭辞"ac"が付いた最後のタグを取得します。たとえばac1.0.0、またはで名前が付けられたタグac1.0.5。名前の他のタグは1.0.01.1.0無視されます。

git tag -l [0-9].* | tail -n1

最初の文字がである最後のタグを取得し0-9ます。したがって、最初の文字a-zが含まれるタグは無視されます。

より詳しい情報

git tag --help # Help for `git tag`

git tag -l <pattern>

指定されたパターン(パターンが指定されていない場合はすべて)に一致する名前のタグをリストします。引数なしで「git tag」を実行すると、すべてのタグもリストされます。パターンはシェルのワイルドカードです(つまり、fnmatch(3)を使用して一致します)。複数のパターンを指定できます。それらのいずれかが一致する場合、タグが表示されます。


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

更新

git tag --helpsort議論について。プロパティが存在しないlexicorgraphic order場合は、デフォルトで使用されますtag.sort

ソート順は、デフォルトでtag.sort変数が構成されている場合はその値に設定され、存在しない場合は辞書式順序になります。git-config(1)を参照してください。

グーグルの後で、誰かが git 2.8.0が次の構文をサポートすると言った

git tag --sort=committerdate

私にとっては中華料理ではありません。最後のタグは2.11.174ですが、バージョン
2.11


5

最後の2つのタグが必要な場合(たとえば、現在のタグと前のタグの間の変更ログを生成するため)は、次のように機能します。最新のタグがである状況でのみテストしましたHEAD

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

それは私のニーズに合っていますが、私はgitウィザードではないので、さらに改善できると確信しています。また、コミット履歴が先に進んだ場合に壊れると思われます。それが誰かを助けるために私はただ共有しています。


4

私が最初に考えたのはgit rev-list HEAD、と組み合わせて、すべてのリビジョンを新しい順にリストしたを使用できるということgit tag --containsです。git tag --contains空でないリストを生成するrefを見つけたら、最新のタグを見つけました。


4

特定のブランチに適用された最後のタグを見つけたい場合は、以下を試すことができます。

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

3

現在のブランチで最新のタグ名(タグの日付によって)を取得する1つのライナーが必要な場合:

git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD

これを使用して、セットアップでバージョン番号を設定します。

出力例:

v1.0.0

Windowsでも動作します。


1
Linuxの(Debianのストレッチ)に私が取得-bash: syntax error near unexpected token '('
ジェレミー・デイヴィス

1
その部分を引用符(つまり--format="%(refname:short)")で囲み、スキップする--points-at=HEADと機能します。最後のスイッチでは何も返されませHEADん。タグ付けされていないためでしょうか?
Jeremy Davis

@JeremyDavis、はい、あなたのHEADタグが付いていないからだと思います。
Markus

2

これは古いスレッドですが、多くの人がOPの質問に対する最も単純で最も簡単な最も正しい答えを見落としているようです。現在のブランチの最新のタグを取得するには、を使用しますgit describe HEAD。できました。

編集:リモートであっても、有効な参照名を指定できます。つまり、git describe origin/masterorigin / masterから到達できる最新のタグを教えてくれます。


「最新のタグ」がブランチによって処理されることを保証するものは何もありません。2つの作業溶液であるfor-each-refコマンド(stackoverflow.com/a/5261470/515973)との組み合わせrev-list及びdescribestackoverflow.com/a/7979255/515973
ジュリアンCarsique

1
これは私にとって最新のタグを取得しません。
K-SOの毒性が高まっています。

git describe branchname --tagsブランチ(gitバージョン2.12.2)で最新のタグを取得するために機能します
Rob_M

0

現在のブランチの前にある現在のブランチ/タグ名でのみ最新のタグを取得するには、次を実行する必要がありました

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH

ブランチマスター:

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448

ブランチカスタム:

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

そして、次のタグ付けのためにタグを増やして+1する最後の必要性です。

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'

0

質問通り、

現在のブランチで最新のタグ名を取得する方法

あなたが欲しい

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parentgit logマージされた履歴の詳細--pretty=%dを表示しないように指示し、装飾、つまりコミットのローカル名のみを表示するように指示します。grep -m1「1つだけに一致」と表示されるため、最新のタグのみが取得されます。


0

タグがソート可能な場合:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1

0

ここでは、注釈なしタグと注釈付きタグについてあまり言及していません。'describe'は注釈付きタグで機能し、注釈なしタグを無視します。

これは醜いですが、要求されたジョブを実行し、他のブランチ(およびコマンドで指定されたブランチではなく、以下の例ではマスター)でタグを検出しません。

フィルタリングは最適化(統合)する必要がありますが、これも仕事のようです。

git log  --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1

私はこれを使用するつもりですので、批評は歓迎します:)


-2

最新のタグ名を取得するもう1つの簡単な方法は、

git tag | tail -1

または

TAG=$(git tag | tail -1)

変数に格納します。

git tag使用可能なすべてのタグをリストし、結果の場合は最後の行を返します。tail-1


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