Как узнать, на какой коммит указывает тег в Git?

411

У меня есть куча аннотированных тегов в хранилище, и я хочу выяснить, на какой коммит они указывают. Есть ли команда, которая будет просто перечислять теги и их коммиты SHA? Проверка метки и взгляд на ГОЛОВУ кажутся мне слишком трудоемкими.

Обновить

После того, как я прочитал ответы, я понял, что на самом деле я просто хотел посмотреть на историю, ведущую к тегу, для чего git log <tagname>достаточно.

Ответ, помеченный как ответ, полезен для получения списка тегов и их коммитов, о чем я и просил. Я уверен, что с помощью небольшого количества хакерских оболочек их можно преобразовать в сообщение SHA + Commit.

Игорь Зевака
источник
3
Я хочу указать, что git show-refпоказывает ша тега, а не ревизии репо. $ git show-ref test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD теперь находится на c7f8831 ... $ git checkout 08b9c77 HEAD сейчас на c7f8831 ...
Константин Пелепелин
если ваши теги аннотированы, тогда вам нужно--dereference
Тревор Бойд Смит

Ответы:

348

Один из способов сделать это будет с git rev-list. Следующее выведет коммит, на который указывает тег:

$ git rev-list -n 1 $TAG

Вы можете добавить его как псевдоним, ~/.gitconfigесли вы часто его используете:

[alias]
  tagcommit = rev-list -n 1

А затем позвоните с помощью:

$ git tagcommit $TAG
mipadi
источник
30
Почему бы не использовать git rev-parse <tag>? Или git rev-list -1 <tag>?
Якуб Наребски
52
@ Jakub: git rev-parse $TAGвозвращает SHA1 объекта тега, а не коммит, на который он указывает. git rev-list -1работает, хотя.
Мипади
11
@mipadi: Для не-аннотированный тегах soedn't значения; для аннотированных тегов вы можете использовать git rev-parse $TAG^{commit}или git rev-parse $TAG^{}разыменовать аннотированный / подписанный тег
Jakub Narębski
5
Вы можете использовать:git rev-list $TAG --max-count=1
b73
4
@RobinHsu: если у вас есть аннотированные теги, созданные с помощью git tag -aили git tag -s, то git rev-parse <tag>вы получите SHA-1 самого объекта тега , а git rev-list -1 <tag>SHA-1 коммита (ревизии), на который он указывает, так же, как git rev-parse <tag>^{commit}. НТН.
Якуб Наребски
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
CB Bailey
источник
Спасибо за это, это фактически скрывает семантику взгляда на .git/packed-refsили.git/refs/tags/*
Игорь Зевака
3
хммм. в моем хранилище происходит странное поведение: тег git -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; см. ответ Якуба Наребского
NickSoft,
6
это работает, хотя мне интересно, не имеет ли смысла git tag --verboseпоказывать их тоже?
неполярность
34
Это покажет ссылку самого тега, а не фиксацию, на которую указывает тег. Вам нужно добавить -dфлаг, чтобы получить указанный коммит (во второй строке).
Старый Pro
4
@CharlesBailey, достаточно справедливо, но вопрос и ответы превратились в аннотированные теги, и тот факт, что git show-refэти два тега ведут себя по-разному, не является очевидным или общеизвестным.
Старый Про
104

Просто используйте git show <tag>

Тем не менее, он также сбрасывает коммиты diff. Чтобы пропустить эти различия, используйте git log -1 <tag>. (Спасибо @DolphinDream и @demisx!)

Hlung
источник
7
На SO, когда у вопроса есть много разных возможных ответов, сначала публикуются ответы, которые сначала публикуются, ставя их в верхней части списка и, таким образом, получая больше голосов позже. Это петля обратной связи смещения, основанная на скорости отклика, а не на качестве отклика. При достаточном воображении эту проблему можно решить.
Самбест
6
«Лучшее решение» для чего? Если интерес заключается в том, чтобы узнать SHA коммита, тег указывает на «git show <mytag>», НЕ лучшее решение. Эта команда покажет весь diff, который вводит коммит. Для перечисления только SHA коммита тег указывает на «git rev-list <mytag> -n 1» - это правильное решение.
DolphinDream
Это не ответ на вопрос ОП. git show <tag>показывает разницу, а не фиксацию, на которую указывает тег.
demisx
@demisx О чем ты говоришь ?? Он определенно показывает хеш коммита, тегер, дату и другую информацию. Попробуй это.
Хлунг
4
@Hlung Как указывал @DolphinDream, git showна экран выводится гораздо больше материала, которого там не должно быть. Это скрывает фактический хеш коммита, который каждый ищет. Лучшая команда, git log -1 [tag-name]или, git log -1 --pretty=oneline [tag-name]если вы хотите oneliners.
demisx
40

В моем хранилище git show-ref TAGпоказывает хэш тега, а не хеш коммита, на который он указывает.

git show-ref --dereference TAG дополнительно показывает коммит, на который указывает

orip
источник
34

От Игоря Зевака :

Резюме

Поскольку существует около 4 почти одинаково приемлемых, но разных ответов, я кратко изложу все различные способы оформления тега.

  1. git rev-list -1 $TAG( ответ ). git rev-listвыводит коммиты, которые приводят к $TAGаналогу, git logно показывают только SHA1 коммита. -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}(четыре шляпы).

  6. cat .git/refs/tags/*или cat .git/packed-refs( ответ ) в зависимости от того, является ли тег локальным или получен с удаленного компьютера.

user456814
источник
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 (для которого необходимы четыре шляпы (^) вместо одной). Суффикс ~<number>дает <номер> родительский коммит, поэтому ~0выдает сам коммит. Кстати, ^0также является допустимым сокращением для ^{commit}суффикса ревизии.
Аттила
15

Как насчет этого:

git log -1 $TAGNAME

ИЛИ

git log -1 origin/$TAGNAME
Туонг Ле
источник
10

Чтобы получить sha / hash коммита, на который ссылается тег (а не sha тега):

git rev-list -1 <tag>

Даниэль Литтл
источник
8

Я также хотел бы знать «правильный» путь, но пока вы можете сделать это:

git show mytag | head -1    
gahooa
источник
С коммитом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 Bailey на 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все же работал.
Игорь Зевака
2

Я также хотел бы знать правильный путь , но вы всегда можете заглянуть в:

$ cat .git/packed-refs 

или:

$ cat .git/refs/tags/*
Мик
источник
Правильно, поэтому поведение упакованных ссылок и тегов / ссылок несколько отличается, упакованные ссылки - это текстовый файл, содержащий теги и SHA, тогда как ссылки / теги / представляют собой каталог с текстовыми файлами, названный в честь тега, содержащего SHA. Я на самом деле думаю, что правильный способ сделать это с git rev-list.
Игорь Зевака
2

Это даст вам текущий хэш SHA1

Сокращенный коммит хеш

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

Совершить хэш

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
Луис
источник
1
кажется, не работает в версии, которую я имею, но git log <tag> -n 1 --pretty=%Hработает
Энди
2

Если вы хотите увидеть подробную информацию о теге 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) .....
Ави Шарелл
источник
0

Таким образом, у меня есть множество папок релиза, где эти папки могут быть извлечены из одного из нескольких различных репозиториев, и могут быть dev, qa или master ветками или могут быть производственными выпусками, извлечены из тега, и тег может быть аннотированный или нет. У меня есть скрипт, который будет смотреть на целевую папку и получать ответ в форме -. Проблема в том, что разные версии 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
sibaz
источник
0

Можно использовать ниже, Это даст хеш коммита
git show -s --format=%H <tag>^{commit}

Если требуется сокращенный хеш коммита, git show -s --format=%h <tag>^{commit}

Реддисехар Гадупути
источник