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.


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

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

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!)


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.


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.


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).


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

10

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

git rev-list -1 <tag>


8

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

git show mytag | head -1    

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.


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

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)'"

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

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.


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/*

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

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) .....

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

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}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.