如何判断标签指向哪个提交?

我有一堆unannotated标签存储库中,我想弄清楚他们指向哪个提交。 有没有一个命令,只会列出标签和他们提交SHA? 检查标签并看着HEAD对我来说似乎有点太过分了。

更新

我意识到我经历了一些反应之后,我真正想要的仅仅是查看git log <tagname>标签的历史logging,而git log <tagname>就足够了。

标记为答案的答案对于获取标签及其提交列表很有用,这就是我所要求的。 有一点壳hackery我敢肯定有可能转换成SHA +提交消息。

一个办法就是用git rev-list 。 以下将输出标签指向的提交:

 $ git rev-list -n 1 $TAG 

你可以添加它作为~/.gitconfig的别名,如果你使用它很多:

 [alias] tagcommit = rev-list -n 1 

然后用以下方式调用它:

 $ git tagcommit $TAG 
 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 show <tag>

更新 :当git show <tag>在第一行显示提交散列时,它也会在某些情况下(例如,非合并提交)在命令行中转储差异。 要忽略结果中不需要的差异,请改用git log -1 <tag> 。 (感谢@DolphinDream和@demisx!)

使用

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

(即使注释标签也会返回提交的SHA-1)。


如果<tag>没有注释, git show-ref <tag>也可以工作。 总是有git for-each-ref (详情请参阅文档)。

在我的仓库上, git show-ref TAG显示了标签的散列,而不是它指向的提交的散列。

git show-ref --dereference TAG另外还显示了所指向的提交。

从伊戈尔Zevaka :

概要

由于有大约4个几乎可以接受但不同的答案,我将总结所有不同的方式来标记皮肤。

  1. git rev-list -1 $TAG ( answer )。 git rev-list输出提交给$TAG的提交,类似于git log但只显示提交的SHA1。 -1将输出限制为它指向的提交。

  2. git show-ref --tags ( answer )将显示所有标签(本地和从远程获取)及其SHA1。

  3. git show-ref $TAG ( answer )将显示标签及其path以及SHA1。

  4. git rev-parse $TAG ( answer )将显示未注释标签的SHA1。

  5. git rev-parse --verify $TAG^{commit} ( answer )将显示带注释和不带注释的标签的SHA1。 在Windows上使用git rev-parse --verify %TAG%^^^^{commit} (四个帽子)。

  6. cat .git/refs/tags/*或者cat .git/packed-refs ( answer ),这取决于标签是本地还是从远程获取。

这个怎么样:

 git log -1 $TAGNAME 

要么

 git log -1 origin/$TAGNAME 

为了得到标签引用的提交的sha / hash(不是标签的sha):

git rev-list -1 <tag>

我也想知道“正确”的方式,但同时你可以这样做:

 git show mytag | head -1 

您还可以更容易地解释标签所指向的位置

 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 

这将使您获得当前的SHA1散列

缩写提交哈希

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

提交哈希

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

尽pipe这已经很老了,但我想我会指出一个很酷的function,我刚刚发现列表标签提交:

 git log --decorate=full 

它将显示结束/开始提交的分支,以及提交的标记。

我也想知道正确的方法 ,但你总是可以偷看到:

 $ cat .git/packed-refs 

要么:

 $ cat .git/refs/tags/* 

如果你想查看标签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) ..... 

这不显示文件名,但至less你感觉到的存储库。

 cat .git/refs/tags/* 

该目录中的每个文件都包含指向提交的提交SHA。

所以我有一个释放文件夹的负载,其中这些文件夹可以从几个不同的回购站之一签出,可能是dev,qa或主分支,或者可能是生产版本,从标签签出,标签可能是注释与否。 我有一个脚本,将查看目标文件夹,并得到一个答案的forms – 。 问题是不同版本的git返回不同的状态'标签签出。

所以我发现git show-ref --tags最初工作,除了注释的标签。 然而,添加-d为标签列表添加了一个单独的条目,一个用于标签,另一个用于注释(注释提交被标识为^ {},我用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