web-dev-qa-db-ja.com

Gitでタグがどのコミットを指しているかを知る方法は?

私はリポジトリにアノテーションの付いていないタグがたくさんあるので、それらがどのコミットを指しているのかを調べたいと思います。タグとそのコミットSHAをリストするだけのコマンドはありますか?タグをチェックアウトしてHEADを見るのは、ちょっと面倒です。

更新

レスポンスを調べた後、私が実際に望んでいたのは単にタグに至るまでの履歴を見ることであり、git log <tagname>で十分であることに気付きました。

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

364
Igor Zevaka

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

$ git rev-list -n 1 $TAG

よく使うのであれば、~/.gitconfigにエイリアスとして追加できます。

[alias]
  tagcommit = rev-list -n 1

そしてそれを呼び出します。

$ git tagcommit $TAG
293
mipadi
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
215
CB Bailey

git show <tag>を使うだけ

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

93
Hlung

私のリポジトリでは、git show-ref TAGはタグのハッシュを示していますが、それが指すコミットのハッシュではありません。

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

37
orip

つかいます

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

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


git show-ref <tag>に注釈が付いていなくても<tag>は機能します。そしてgit for-each-refが常にあります(詳細はドキュメントを参照してください)。

32
Jakub Narębski

から Igor Zevaka

概要

約4つの同じくらい許容できるけれども異なった答えがあるので、私はタグを皮をむくためにすべての異なった方法をまとめます。

  1. git rev-list -1 $TAGanswergit rev-listは、$TAGと同様のgit logに至るコミットを出力しますが、コミットのSHA1のみを表示します。 -1は、出力をそれが指すコミットに制限します。

  2. git show-ref --tagsanswer )は、すべてのタグ(ローカルおよびリモートからフェッチされたもの)とそれらのSHA1を表示します。

  3. git show-ref $TAGanswer )はSHA1と共にタグとそのパスを表示します。

  4. git rev-parse $TAGanswer )は、注釈なしタグのSHA1を表示します。

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

  6. タグがローカルであるかリモートからフェッチされるかに応じて、cat .git/refs/tags/*またはcat .git/packed-refsanswer )。

32
user456814

これはどう:

git log -1 $TAGNAME

OR

git log -1 Origin/$TAGNAME
15
Tuong Le

タグが参照するコミットのsha/hashを取得するには(タグのshaではなく):

git rev-list -1 <tag>

10
Daniel Little

これはかなり古いものですが、コミット付きのタグを一覧表示するために見つけた素晴らしい機能を指摘することにしました。

git log --decorate=full

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

7
Terrence Reilly

私も「正しい」方法を知りたいのですが、それまでの間、あなたはこれをすることができます:

git show mytag | head -1    
7
gahooa

タグがどこを指しているのかをよりわかりやすく理解することもできます。

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

これはあなたに現在のSHA1ハッシュを取得します

省略されたコミットハッシュ

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

ハッシュをコミット

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

私も知りたいのですが正しい方法しかし、あなたはいつでもどちらかを覗くことができます:

$ cat .git/packed-refs 

または

$ cat .git/refs/tags/*
2
miku

SOMETAGタグの詳細(tagger、dateなど)、それが指すコミットのハッシュ、およびコミットに関する少しの情報がありますが、完全な差分は含まれていません。

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) .....
2
Avy Sharell

gitメーリングリスト から、タグ付けされたタグを自動的に間接参照しながらタグのコミットハッシュのリストを取得する方法は次のとおりです。

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

これはファイル名を表示しません、しかし少なくともあなたはリポジトリの感覚を得ます。

cat .git/refs/tags/*

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

1
Peter Stuifzand

ですから、私はたくさんのリリースフォルダを持っています。そこでは、それらのフォルダは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
sibaz

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

短縮コミットハッシュが必要な場合は、git show -s --format=%h <tag>^{commit}