Bagaimana cara mengetahui tanda komit mana yang mengarah pada Git?

411

Saya memiliki banyak tag yang tidak ditandai di repositori dan saya ingin mencari tahu komit mana yang mereka tuju. Apakah ada perintah yang hanya akan mencantumkan tag dan komit SHA mereka? Memeriksa tag dan melihat KEPALA tampaknya agak terlalu melelahkan bagi saya.

Memperbarui

Saya menyadari setelah saya pergi melalui tanggapan bahwa apa yang sebenarnya saya inginkan adalah hanya melihat sejarah yang mengarah ke tag, yang git log <tagname>cukup.

Jawaban yang ditandai sebagai jawaban berguna untuk mendapatkan daftar tag dan komitmennya, itulah yang saya tanyakan. Dengan sedikit peretasan shell, saya yakin mungkin mengubahnya menjadi pesan SHA + Commit.

Igor Zevaka
sumber
3
Saya ingin menunjukkan yang git show-refmenunjukkan sha dari tag, bukan sha dari revisi repo. $ tes git-ref 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 ref / tag / test $ tes checkout git KEPALA sekarang di c7f8831 ... $ git checkout 08b9c77 KEPALA sekarang di c7f8831 ...
Konstantin Pelepelin
jika tag Anda diberi catatan maka Anda perlu--dereference
Trevor Boyd Smith

Jawaban:

348

Salah satu cara untuk melakukan ini adalah dengan git rev-list. Berikut ini akan menampilkan komit yang dituju oleh tag:

$ git rev-list -n 1 $TAG

Anda bisa menambahkannya sebagai alias ~/.gitconfigjika Anda sering menggunakannya:

[alias]
  tagcommit = rev-list -n 1

Dan kemudian menyebutnya dengan:

$ git tagcommit $TAG
mipadi
sumber
30
Kenapa tidak digunakan git rev-parse <tag>? Atau git rev-list -1 <tag>?
Jakub Narębski
52
@ Jakub: git rev-parse $TAGmengembalikan SHA1 dari objek tag, bukan komit yang ditunjuknya. git rev-list -1bekerja, meskipun.
mipadi
11
@mipadi: Untuk un-dijelaskan tag itu soedn't peduli; untuk tag beranotasi, Anda dapat menggunakan git rev-parse $TAG^{commit}atau git rev-parse $TAG^{}untuk menandai tag beranotasi / bertanda tangan
Jakub Narębski
5
Anda dapat menggunakan:git rev-list $TAG --max-count=1
b73
4
@RobinHsu: jika Anda memiliki tag beranotasi , yang dibuat dengan git tag -aatau git tag -s, maka git rev-parse <tag>akan memberi Anda SHA-1 dari objek tag itu sendiri, sementara git rev-list -1 <tag>akan memberikan SHA-1 dari komit (revisi) yang ditunjuknya, sama dengan git rev-parse <tag>^{commit}. HTH.
Jakub Narębski
240
git show-ref --tags

Misalnya, git show-ref --abbrev=7 --tagsakan menampilkan sesuatu seperti berikut:

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
sumber
Terima kasih untuk itu, ini benar-benar menyembunyikan semantik melihat baik .git/packed-refsatau.git/refs/tags/*
Igor Zevaka
3
hmmm. ia memiliki perilaku aneh di repositori saya: git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 ref / tag / v0.1.1-alpha; lihat jawaban Jakub Narebski
NickSoft
6
ini bekerja, meskipun saya bertanya-tanya bukankah masuk akal untuk git tag --verbosemenunjukkannya juga?
nonopolaritas
34
Ini akan menampilkan referensi dari tag itu sendiri, bukan komit yang ditunjuk oleh tag tersebut. Anda perlu menambahkan -dtanda untuk mendapatkan komit yang dirujuk (di baris kedua).
Old Pro
4
@CharlesBailey, cukup adil, tetapi pertanyaan dan jawaban telah berubah untuk menyertakan tag beranotasi dan fakta bahwa git show-refberperilaku berbeda pada dua jenis tag berbeda tidak jelas atau pengetahuan umum.
Old Pro
104

Gunakan saja git show <tag>

Namun, itu juga kesedihan melakukan diff. Untuk menghilangkan perbedaan tersebut, gunakan git log -1 <tag>. (Terima kasih kepada @DolphinDream dan @demisx!)

Hung
sumber
7
Pada SO, ketika sebuah pertanyaan memiliki banyak kemungkinan jawaban yang berbeda, jawaban yang diposkan pertama-tama akan diputuskan terlebih dahulu - menempatkannya di urutan teratas dalam daftar, dan dengan demikian membuat mereka lebih banyak mendapat suara naik kemudian. Ini adalah loop umpan balik bias berdasarkan kecepatan respons terhadap kualitas respons. Dengan imajinasi yang cukup masalah ini bisa diperbaiki.
samthebest
6
"Solusi terbaik" untuk apa? Jika minat menemukan SHA dari komit, tag menunjuk ke "git show <mytag>" BUKAN solusi terbaik. Perintah ini akan menampilkan seluruh diff yang dikenalkan komit. Untuk daftar hanya SHA dari komit tag menunjuk ke "git rev-list <mytag> -n 1" adalah solusi yang benar.
DolphinDream
Ini bukan jawaban untuk pertanyaan OP. git show <tag>menunjukkan diff, bukan komit yang diarahkan tag.
demisx
@demisx Apa yang kamu bicarakan ?? Itu pasti menunjukkan hash komit, bersama dengan tagger, tanggal, dan informasi lainnya. Cobalah.
Hlung
4
@Hlung Seperti @DolphinDream tunjukkan, git showkesedihan lebih banyak barang di layar yang tidak perlu ada di sana. Ini mengaburkan hash commit aktual yang dicari. Perintah yang lebih baik adalah git log -1 [tag-name]atau git log -1 --pretty=oneline [tag-name]jika Anda menginginkan orang yang tidak berhak.
demisx
40

Di repositori saya, git show-ref TAG menunjukkan hash tag, bukan hash dari commit yang ditunjukkannya.

git show-ref --dereference TAG menunjukkan, selain itu, komit diarahkan.

orip
sumber
34

Dari Igor Zevaka :

Ringkasan

Karena ada sekitar 4 jawaban yang hampir dapat diterima namun berbeda, saya akan merangkum semua cara yang berbeda untuk membuat tag.

  1. git rev-list -1 $TAG( jawab ). git rev-listmenampilkan komit yang mengarah ke yang $TAGserupa dengan git logtetapi hanya menunjukkan SHA1 dari komit. The -1membatasi output untuk komit itu menunjuk pada.

  2. git show-ref --tags( jawab ) akan menampilkan semua tag (lokal dan diambil dari jarak jauh) dan SHA1 mereka.

  3. git show-ref $TAG( jawab ) akan menampilkan tag dan jalurnya bersama dengan SHA1.

  4. git rev-parse $TAG( jawaban ) akan menunjukkan SHA1 dari tag yang tidak ditandai.

  5. git rev-parse --verify $TAG^{commit}( jawaban ) akan menampilkan SHA1 dari tag yang beranotasi dan yang tidak ditandai. Di Windows gunakan git rev-parse --verify %TAG%^^^^{commit}(empat topi).

  6. cat .git/refs/tags/*atau cat .git/packed-refs( jawab ) tergantung pada apakah tag tersebut lokal atau diambil dari jarak jauh.

user456814
sumber
33

Menggunakan

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

(yang akan mengembalikan SHA-1 dari komit bahkan untuk tag beranotasi).


git show-ref <tag>juga akan berfungsi jika <tag>tidak dijelaskan. Dan selalu ada git for-each-ref(lihat dokumentasi untuk detail).

Jakub Narębski
sumber
11
Saya lebih suka git rev-parse <tag>~0yang tampaknya juga berfungsi, dan tidak memerlukan pelarian khusus pada Windows (di mana empat topi (^) diperlukan, bukan satu). Sufiks ~<number>memberikan komit ke <nomor> orangtua, oleh karena itu ~0menghasilkan komit itu sendiri. Btw, ^0juga merupakan singkatan yang valid untuk ^{commit}akhiran revisi.
Attila
15

Bagaimana dengan ini:

git log -1 $TAGNAME

ATAU

git log -1 origin/$TAGNAME
Tuong Le
sumber
10

Untuk mendapatkan sha / hash dari commit yang merujuk tag (bukan sha dari tag):

git rev-list -1 <tag>

Daniel Little
sumber
8

Saya juga ingin tahu cara "benar", tetapi sementara itu, Anda bisa melakukan ini:

git show mytag | head -1    
gahooa
sumber
Dengan titel komitgit show --oneline mytag | head -1
Stphane
7

Meskipun ini cukup lama, saya pikir saya akan menunjukkan fitur keren yang baru saja saya temukan untuk mendaftar tag dengan komit:

git log --decorate=full

Ini akan menampilkan cabang yang mengakhiri / mulai dari komit, dan tag untuk komit.

Terrence Reilly
sumber
4

Anda juga bisa mendapatkan gambar yang lebih mudah diinterpretasikan dari mana tag menunjuk ke penggunaan

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

dan kemudian gulir ke tag yang Anda cari via /.

Tampilan lebih ringkas ( --pretty=oneline) plus semua kepala ( -a) juga dapat membantu:

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

Terlihat sedikit menakutkan, tetapi bisa juga di aliased ~/.gitconfigjika diperlukan.

~/.gitconfig

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

Jawaban singkat pasca-Git-2

Saya tahu pertanyaan ini sudah lama ada di sini. Dan jawaban dari CB Bailey adalah 100% benar:git show-ref --tags --abbrev

Saya suka yang ini lebih baik karena menggunakan git tag:

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

Sederhana. Pendek.

PS alias seperti git taglistdengan perintah ini:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"
Jesper Rønn-Jensen
sumber
3

Dari milis git , berikut adalah cara untuk mendapatkan daftar tanda hash untuk tag dengan dereferencing otomatis untuk tag beranotasi:

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

Ini tidak menunjukkan nama file, tetapi setidaknya Anda merasakan repositori.

cat .git/refs/tags/*

Setiap file dalam direktori tersebut berisi SHA komit yang menunjuk ke komit.

Peter Stuifzand
sumber
Ini tidak berfungsi karena, saya pikir, saya menarik tag dari jarak jauh. .git/packed-refsmeskipun berhasil.
Igor Zevaka
2

Saya juga ingin tahu cara yang benar , tetapi Anda selalu dapat mengintip ke:

$ cat .git/packed-refs 

atau:

$ cat .git/refs/tags/*
miku
sumber
Benar, jadi perilaku untuk ref-pack dan ref / tag agak berbeda, ref-pack adalah file teks yang berisi tag dan SHA, sedangkan ref / tag / adalah direktori dengan file teks yang diberi nama setelah tag yang berisi SHA. Saya benar-benar berpikir bahwa cara yang tepat untuk melakukan ini adalah dengan git rev-list.
Igor Zevaka
2

Ini akan memberi Anda hash SHA1 saat ini

Hash Komit Singkat

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

Hash Komit

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
Louis
sumber
1
tampaknya tidak berfungsi dalam versi yang saya miliki, tetapi git log <tag> -n 1 --pretty=%Htidak
Andy
2

Jika Anda ingin melihat detail dari tag SOMETAG (tagger, tanggal, dll), hash dari komit menunjuk ke dan sedikit info tentang komit tetapi tanpa perbedaan penuh, coba

git show --name-status SOMETAG

Contoh output:

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

Jadi saya punya banyak folder rilis, di mana folder-folder itu mungkin diperiksa dari salah satu dari beberapa repo yang berbeda, dan mungkin dev, qa atau cabang utama atau mungkin rilis produksi, diperiksa dari tag, dan tag mungkin beranotasi atau tidak. Saya memiliki skrip yang akan melihat folder target dan mendapatkan jawaban dalam bentuk -. Masalahnya adalah berbagai versi git mengembalikan status berbeda 'untuk checkout tag.

Jadi saya menemukan git show-ref --tagsbekerja pada awalnya, kecuali untuk tag beranotasi. Namun menambahkan -d menambahkan entri terpisah ke daftar tag, satu untuk tag, yang lain untuk anotasi (komit anotasi diidentifikasi sebagai ^ {} yang saya hapus dengan sed).

Jadi ini adalah inti dari skrip saya, untuk siapa saja yang menginginkannya: -

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
sumber
0

Dapat digunakan di bawah, Ini akan memberikan hash komit
git show -s --format=%H <tag>^{commit}

Jika disingkat melakukan hash diperlukan, git show -s --format=%h <tag>^{commit}

Reddysekhar Gaduputi
sumber