Perlihatkan tag git mana Anda berada?

216

Saya mengalami kesulitan mencari tahu tag mana yang sedang diperiksa.

Ketika saya melakukannya:

git checkout tag1
git branch

Sepertinya saya tidak tahu tag mana yang saya pakai. Hanya mencatat:

* (no branch)
master

Apakah mungkin untuk mengetahui tag mana yang diperiksa? Dalam contoh di atas, ini akan menjadi tag1.

grm
sumber

Jawaban:

326

Sunting : Jakub Narębski memiliki lebih banyak git-fu. Perintah berikut yang jauh lebih sederhana berfungsi dengan sempurna:

git describe --tags

(Atau tanpa --tagsjika Anda telah memeriksa tag beranotasi. Tag saya ringan, jadi saya perlu - tag.)

jawaban asli berikut:

git describe --exact-match --tags $(git log -n1 --pretty='%h')

Seseorang dengan lebih banyak git-fu mungkin memiliki solusi yang lebih elegan ...

Ini memanfaatkan fakta bahwa git-logmelaporkan log mulai dari apa yang Anda periksa. %hmencetak hash yang disingkat. Kemudian git describe --exact-match --tagstemukan tag (ringan atau beranotasi) yang persis cocok dengan komit.

The $()sintaks di atas mengasumsikan Anda menggunakan bash atau mirip.

bstpierre
sumber
22
Hanya menggunakan git describeakan menampilkan nama tag jika Anda tepat pada tag (beranotasi), atau <tag>-<n>-g<shortened sha-1>jika tidak, di mana <n>jumlah komit sejak itu <tag>.
Jakub Narębski
1
@ Jakub - Terima kasih. Saya menambahkan --exact-matchjawaban saya beberapa detik sebelum komentar Anda. Senang mengetahui bahwa Anda dapat menghapusnya dan masih mendapatkan info bagus dari input fuzzier.
bstpierre
Terima kasih, ini persis apa yang saya cari. Btw, bahkan git-gambarkan --exact-match (tanpa --tags) bekerja untuk saya.
GRM
3
Menggunakan git rev-parse HEADadalah solusi yang lebih baik daripada git log -n1 --pretty='%h'... tetapi mengapa Anda tidak bisa begitu saja menulis HEAD(atau tidak sama sekali, sebagai git describestandar untuk HEAD)?
Jakub Narębski
hanya Guybrush yang membenci porselen
vdegenne
71

Ini berhasil untuk saya git describe --tags --abbrev=0

MK
sumber
2
Iya. ini berfungsi bahkan jika Anda tidak tepat pada tag itu! :)
Martin Muzatko
13
Uhhh. ... Jika Anda checkout hash tiga melakukan setelah tag, Anda tidak "pada tag itu." Ini memberi tahu Anda tag terakhir sebelum atau di komit yang diperiksa. Jadi ini tidak benar.
mana
Bekerja pada Windows juga :)
cowlinator
49

Tampilkan semua tag pada KEPALA saat ini (atau komit)

git tag --points-at HEAD
George Pavelka
sumber
1
Perhatikan bahwa perintah ini tidak melaporkan kesalahan di baris perintah bahkan jika hasilnya kosong. Bug? Ini juga mengembalikan daftar jika ada beberapa tag di lokasi itu. Ini jawaban terbaik tetapi penulis harus melanjutkan dengan hati-hati mengingat peringatan ini.
mana
Mengikuti komentar @ ingyhere. Ya itu informasi yang bagus sehingga tidak ada kesalahan, dan orang-orang perlu menangani hasilnya. Tapi saya tidak akan menyebutnya bug. Untuk kasus saya, "kosong jika tidak ada tag" valid. Kasus lain, seseorang dapat menyimpannya ke variabel kemudian memeriksa apakah itu kosong (tautan ke instruksi bash)
driftcatcher
23

git describeadalah perintah porselen , yang harus Anda hindari:

http://git-blame.blogspot.com/2013/06/checking-current-branch-programatically.html

Sebaliknya, saya menggunakan:

git name-rev --tags --name-only $(git rev-parse HEAD)
Greg
sumber
11
Ini mengembalikan "tidak terdefinisi"
Asing
4
Ini menghasilkan tanda ^0untuk komit yang sesuai dengan tag (misalnya, untuk tag 1.0itu output 1.0^0). Apakah ada cara untuk mendapatkan output Git saja 1.0, atau haruskah saya menggunakan sed untuk ini?
Daniel Serodio
13
Hanya beberapa tipuan konseptual: Saya pikir Anda membalikkan makna porselen dan pipa ledeng. Tidak apa-apa menggunakan porselen, tingkat tinggi dan dimaksudkan untuk penggunaan normal . Plumbing ist internal (seperti namanya) dan hanya tidak direkomendasikan karena pengembang git berhak untuk mengubah argumen dan output mereka tanpa peringatan. Jadi saran pertama Anda sebenarnya adalah yang sedikit lebih tepat.
Leo Antunes
5
Artikel yang ditautkan mengatakan untuk menghindari penggunaan "git branch" karena tidak berfungsi untuk kasus penggunaan ini. Saya tidak bisa memikirkan alasan bagus untuk menghindari penggunaan git. Seperti kata Leo, perintah "Porcelain" adalah perintah yang seharusnya Anda gunakan. Hindari perintah pipa kecuali Anda benar-benar tahu apa yang Anda lakukan. "git menggambarkan" bekerja dengan baik.
Danny
4
Perintah "Porcelain" adalah yang harus Anda gunakan, bukan yang harus Anda hindari. Mereka adalah perintah yang outputnya dapat dibaca mesin dan tidak akan berubah di versi masa depan, sehingga dapat diandalkan dalam skrip dll. Perintah non-porselen cenderung menghasilkan lebih banyak keluaran yang dapat dibaca manusia, tetapi dapat berubah di versi masa depan misalnya untuk membuatnya lebih dapat dibaca, bukan karena sesuatu yang penting telah benar-benar berubah.
rjmunro
22

Ketika Anda melihat tag, Anda memiliki apa yang disebut "kepala terpisah" . Biasanya, komit Git's HEAD adalah pointer ke cabang yang saat ini telah Anda periksa. Namun, jika Anda memeriksa sesuatu selain cabang lokal (tag atau cabang jarak jauh, misalnya) Anda memiliki "kepala terpisah" - Anda tidak benar-benar berada di cabang mana pun. Anda tidak boleh membuat komitmen saat berada di kepala yang terpisah.

Tidak masalah untuk memeriksa tag jika Anda tidak ingin melakukan pengeditan. Jika Anda hanya memeriksa isi file, atau Anda ingin membangun proyek Anda dari sebuah tag, tidak apa-apa untuk git checkout my_tagdan bekerja dengan file, selama Anda tidak membuat komitmen . Jika Anda ingin mulai memodifikasi file, Anda harus membuat cabang berdasarkan tag:

$ git checkout -b my_tag_branch my_tag

akan membuat cabang baru bernama my_tag_branchmulai dari my_tag. Aman untuk melakukan perubahan pada cabang ini.

mipadi
sumber
1
Jawaban yang fantastis.
Panos Filianos
9

git log --decorate

Ini akan memberi tahu Anda referensi apa yang menunjuk ke komit yang sedang diperiksa.

chriswatrous
sumber