Gitでタグが指すコミットを確認するにはどうすればよいですか?


410

リポジトリに注釈なしのタグがたくさんありますが、それらが指すコミットを調べたいのですが。タグとそのコミットSHAを一覧表示するコマンドはありますか?タグをチェックして頭を見るのは、私にとって少し面倒すぎるようです。

更新

実際にやりたかったのは、タグに至るまでの履歴を見れgit log <tagname>ば十分だということでした。

回答としてマークされている回答は、タグとそのコミットのリストを取得するのに役立ちます。少しのシェルハッカーで、それらをSHA + Commitメッセージに変換することが可能だと確信しています。


3
git show-refrepoリビジョンのshaではなく、タグのsha を示していることを指摘したいと思います。$ git show-ref test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD is now at c7f8831 ... $ git checkout 08b9c77 HEAD is now at c7f8831 ...
Konstantin Pelepelin

タグに注釈が付けられている場合は、必要です--dereference
Trevor Boyd Smith

回答:


347

これを行う1つの方法は、を使用することgit rev-listです。以下はタグが指すコミットを出力します:

$ git rev-list -n 1 $TAG

~/.gitconfigよく使用する場合は、エイリアスとして追加できます。

[alias]
  tagcommit = rev-list -n 1

そして、それを次のように呼び出します:

$ git tagcommit $TAG

30
なぜ使用しないのgit rev-parse <tag>ですか?それともgit rev-list -1 <tag>
JakubNarębski、2009

51
@ Jakub:git rev-parse $TAGタグオブジェクトのSHA1を返します。それが指しているコミットではありません。git rev-list -1動作します。
mipadi 2009

11
@mipadi:注釈のないタグの場合、重要ではありません。使用できる注釈付きタグの場合、git rev-parse $TAG^{commit}またはgit rev-parse $TAG^{}注釈付き/署名付きタグを逆参照するには
JakubNarębski09年

5
あなたは使用することができます:git rev-list $TAG --max-count=1
B73

4
@RobinHsu:またはで作成された注釈付きタグがある場合は、タグオブジェクト自体のSHA-1を提供しますが、それが指すコミット(リビジョン)のSHA-1を提供します。HTH。git tag -agit tag -sgit rev-parse <tag>git rev-list -1 <tag>git rev-parse <tag>^{commit}
JakubNarębski2016年

240
git show-ref --tags

たとえばgit show-ref --abbrev=7 --tags、次のようなものが表示されます。

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

そのためのおかげで、これは実際にどちらかを見ているのセマンティクス隠す.git/packed-refs.git/refs/tags/*
イゴールZevaka

3
うーん。私のリポジトリでは奇妙な動作をしています:git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags-> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; Jakub Narebskiの回答を参照してください
NickSoft

6
これは機能しますが、git tag --verboseそれらを表示することも意味がないのではないでしょうか。
非極性

34
これは、タグが指すコミットではなく、タグ自体の参照を表示します。-d参照されたコミットを取得するには、フラグを追加する必要があります(2行目)。
Old Pro

4
@CharlesBailey、かなり公平ですが、質問と回答には注釈付きタグが含まれるようにモーフィングさgit show-refれており、2つの異なるタイプのタグで異なる動作をするという事実は明白でも一般的な知識でもありません。
Old Pro

104

使うだけ git show <tag>

ただし、コミットの差分もダンプします。これらの差分を省略するには、を使用しますgit log -1 <tag>。(@DolphinDreamと@demisxに感謝します!)


7
SOでは、質問にさまざまな回答が含まれている場合、最初に投稿された回答が最初に賛成票を獲得します。リストの一番上に配置し、後でより多くの賛成票を獲得します。これは、応答品質よりも応答速度に基づくバイアスフィードバックループです。十分な想像力があれば、この問題は修正できます。
samthebest

6
何のための「最良の解決策」?コミットのSHAを見つけることに関心がある場合は、タグが "git show <mytag>"をポイントしていることが最善の解決策ではありません。このコマンドは、コミットが導入する差分全体を表示します。コミットのSHAのみをリストする場合、タグが「git rev-list <mytag> -n 1」をポイントすることが正しい解決策です。
DolphinDream 2015年

これはOPの質問に対する答えではありません。git show <tag>タグが指すコミットではなく、差分を表示します。
demisx

@demisx何のことをいっているのですか。これは間違いなく、タガー、日付、その他の情報とともにコミットハッシュを示します。それを試してみてください。
Hlung

4
@Hlung @DolphinDreamが指摘したgit showように、画面に表示する必要のないものをもっとたくさんダンプします。探している実際のコミットハッシュを覆い隠します。より良いコマンドは、git log -1 [tag-name]またはgit log -1 --pretty=oneline [tag-name]、ワンライナーが必要な場合です。
demisx

40

私のリポジトリでgit show-ref TAGは、タグが指すコミットのハッシュではなく、タグのハッシュが表示されます。

git show-ref --dereference TAG さらに、ポイントされているコミットを示します。


34

イゴールゼバカから:

概要

ほぼ同じように許容できる約4つの異なる回答があるため、タグのスキンを作成するさまざまな方法をすべて要約します。

  1. git rev-list -1 $TAG答え)。git rev-listコミットのSHA1に$TAG類似しているgit logが、それだけを示しているコミットを出力します。-1それがで指すコミットに出力を制限します。

  2. git show-ref --tags回答)は、すべてのタグ(ローカルおよびリモートから取得)とそのSHA1を表示します。

  3. git show-ref $TAG回答)タグとそのパスがSHA1とともに表示されます。

  4. git rev-parse $TAG回答)には、注釈のないタグのSHA1が表示されます。

  5. git rev-parse --verify $TAG^{commit}回答)には、注釈付きタグと注釈なしタグの両方のSHA1が表示されます。Windowsではgit rev-parse --verify %TAG%^^^^{commit}(4つの帽子)を使用します。

  6. cat .git/refs/tags/*またはcat .git/packed-refs回答)タグがローカルであるか、リモートからフェッチされるかによって異なります。


33

使用する

git rev-parse --verify <tag>^{commit}

(注釈付きタグの場合でも、コミットのSHA-1を返します)。


git show-ref <tag><tag>注釈が付けられていない場合にも機能します。そして、常に存在しますgit for-each-ref(詳細については、ドキュメントを参照してください)。


11
私はgit rev-parse <tag>~0どちらもうまくいくようで、Windowsでは特別なエスケープを必要としません(1つの帽子ではなく4つの帽子(^)が必要です)。サフィックス~<number>は<number>番目の親コミットを提供するため~0、コミット自体が生成されます。ところで、リビジョンサフィックスの^0有効な省略表現でもあります^{commit}
Attila

15

これはどう:

git log -1 $TAGNAME

または

git log -1 origin/$TAGNAME


8

「正しい」方法も知りたいのですが、それまでは次のようにしてください。

git show mytag | head -1    

コミットタイトルありgit show --oneline mytag | head -1
Stphane

7

これはかなり古いですが、コミットでタグをリストするために見つけたクールな機能を指摘したいと思いました:

git log --decorate=full

コミットで終了/開始するブランチと、コミットのタグが表示されます。


4

タグがどこを使用しているかを示す、より解釈しやすい図を取得することもできます

git log --graph |git name-rev --stdin --tags |less

次に、探しているタグまでスクロールします /

よりコンパクトなビュー(--pretty=oneline)とすべての頭(-a)も役立ちます。

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

少し恐ろしいように見えますが~/.gitconfig、必要に応じてエイリアスにすることもできます。

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

4

短いポストGit-2回答

この質問がかなり前から出ていることは知っています。そしてCBベイリーからの答えは100%正しいです:git show-ref --tags --abbrev

それを使用するので、私はこれがより好きgit tagです:

git tag --list --format '%(refname:short) %(objectname:short)'

シンプル。ショート。

PS git taglistは次のコマンドのようにエイリアスを付けます:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

3

gitメーリングリストから、注釈付きタグの自動逆参照を使用してタグのコミットハッシュのリストを取得する方法を次に示します。

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

2

これはファイル名を表示しませんが、少なくともリポジトリの感触をつかむことができます。

cat .git/refs/tags/*

そのディレクトリ内の各ファイルには、コミットを指すコミットSHAが含まれています。


これは、タグをリモートからプルしたため、機能しませんでした。.git/packed-refsでもうまくいきました。
Igor Zevaka

2

私も正しい方法を知りたいのですが、いつでも次のいずれかを覗くことができます。

$ cat .git/packed-refs 

または:

$ cat .git/refs/tags/*

そのため、packed-refsとrefs / tagsの動作は多少異なりますが、packed-refsはタグとSHAを含むテキストファイルですが、refs / tags /はSHAを含むタグにちなんで名付けられたテキストファイルを含むディレクトリです。これを行う適切な方法は、であると私は実際に考えていますgit rev-list
Igor Zevaka

2

これにより、現在のSHA1ハッシュが取得されます

短縮されたコミットハッシュ

git show <tag> --format="%h" --> 42e646e

ハッシュをコミット

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

1
私が持っているバージョンでは動作しないようですが、git log <tag> -n 1 --pretty=%H動作します
Andy

2

タグSOMETAG(タガー、日付など)の詳細、タグが指すコミットのハッシュ、およびコミットに関する少しの情報を確認したい場合は、完全な差分なしで試してください。

git show --name-status SOMETAG

出力例:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

0

だから私はリリースフォルダをたくさん持っています、それらのフォルダはいくつかの異なるリポジトリの1つからチェックアウトされるかもしれません、そしてdev、qa、またはmasterブランチであるかもしれません、またはタグからチェックアウトされる本番リリースかもしれません、そしてタグは注釈付きかどうか。ターゲットフォルダーを調べて、フォームで答えを返すスクリプトがあります。問題は、gitの異なるバージョンがタグのチェックアウトに対して異なるステータスを返すことです。

だから私は見つけた git show-ref --tagsため、注釈付きタグを除いて、最初は機能している。ただし、-dを追加すると、タグのリストに別のエントリが追加され、1つはタグ用、もう1つは注釈用に追加されました(注釈コミットは^ {}として識別され、sedで削除しました)。

だから、これは私のスクリプトの中核です。

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

0

以下を使用できます、それはコミットハッシュを与えます
git show -s --format=%H <tag>^{commit}

省略されたコミットハッシュが必要な場合、 git show -s --format=%h <tag>^{commit}

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