แสดงแท็ก git ที่คุณใช้อยู่?


216

ฉันมีปัญหาในการค้นหาว่าแท็กใดถูกเช็คเอาต์

เมื่อฉันทำ:

git checkout tag1
git branch

ฉันไม่สามารถหาแท็กที่ฉันใช้อยู่ได้ มันบันทึกเท่านั้น:

* (no branch)
master

เป็นไปได้ไหมที่จะตรวจสอบว่าแท็กใดบ้างที่เช็คเอาท์? tag1ในตัวอย่างข้างต้นนี้จะเป็น

คำตอบ:


326

แก้ไข : Jakub Narębskiมี git-fu มากขึ้น คำสั่งที่ง่ายกว่านี้ดังต่อไปนี้ทำงานได้อย่างสมบูรณ์:

git describe --tags

(หรือไม่มี--tagsหากคุณตรวจสอบแท็กที่มีคำอธิบายประกอบแท็กของฉันมีน้ำหนักเบาดังนั้นฉันจึงต้องใช้ - แท็ก)

คำตอบเดิมดังต่อไปนี้:

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

คนที่มี git-fu มากกว่าอาจมีวิธีแก้ปัญหาที่สง่างามกว่า ...

นี่เป็นการยกระดับความจริงที่git-logรายงานบันทึกเริ่มต้นจากสิ่งที่คุณเช็คเอาท์ %hพิมพ์แฮชตัวย่อ จากนั้นgit describe --exact-match --tagsค้นหาแท็ก (มีน้ำหนักเบาหรือใส่หมายเหตุ) ที่ตรงกับการส่ง

$()ไวยากรณ์ข้างต้นถือว่าคุณกำลังใช้ทุบตีหรือคล้ายกัน


22
เพียงแค่ใช้git describeจะแสดงชื่อแท็กถ้าคุณตรงกับ (ข้อเขียน) แท็กหรือ<tag>-<n>-g<shortened sha-1>หากไม่ได้ซึ่งเป็นจำนวนการกระทำตั้งแต่<n> <tag>
Jakub Narębski

1
@Jakub - ขอบคุณ ฉันเพิ่ม--exact-matchในคำตอบของฉันก่อนที่ความคิดเห็นของคุณ ดีใจที่ได้ทราบว่าคุณสามารถลบออกและยังได้รับข้อมูลที่ดีจากการป้อนข้อมูลแบบฟัซซี่
bstpierre

ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา Btw, แม้คอมไพล์อธิบาย - จับคู่แบบตรง (ไม่มี - แท็ก) ทำงานให้ฉัน
กรัม

3
การใช้git rev-parse HEADเป็นวิธีแก้ปัญหาที่ดีกว่าgit log -n1 --pretty='%h'... แต่ทำไมคุณไม่สามารถเขียนHEAD(หรือไม่มีอะไรเลยเป็นgit describeค่าเริ่มต้นของ HEAD)?
Jakub Narębski

Guybrush เกลียดเครื่องเคลือบดินเผา
vdegenne

71

สิ่งนี้ใช้ได้สำหรับฉัน git describe --tags --abbrev=0


2
ใช่. สิ่งนี้ใช้ได้แม้ว่าคุณจะไม่ได้อยู่ในแท็กนั้น! :)
Martin Muzatko

13
uhhh ... หากคุณชำระเงินแฮชสามคำสั่งหลังจากแท็กคุณจะไม่ "อยู่ในแท็กนั้น" มันจะบอกคุณว่าแท็กสุดท้ายก่อนหน้าหรือที่การคอมมิทนั้นได้ชำระเงินแล้ว ดังนั้นนี่ไม่ถูกต้อง
ingyhere

ทำงานบน Windows ได้เช่นกัน :)
ประสานงาน

50

แสดงแท็กทั้งหมดใน HEAD ปัจจุบัน (หรือกระทำ)

git tag --points-at HEAD

1
โปรดทราบว่าคำสั่งนี้ไม่ได้รายงานข้อผิดพลาดที่บรรทัดคำสั่งแม้ว่าผลลัพธ์จะว่างเปล่า ข้อผิดพลาด? นอกจากนี้ยังส่งคืนรายการหากมีหลายแท็กในตำแหน่งนั้น มันเป็นคำตอบที่ดีที่สุด แต่ scripters ควรดำเนินการต่อไปด้วยความระมัดระวังโดยคำนึงถึงคำเตือนเหล่านี้
ingyhere

กำลังติดตามความคิดเห็นของ @ ingyhere ใช่มันเป็นข้อมูลที่ดีที่ไม่มีข้อผิดพลาดและผู้คนจำเป็นต้องจัดการกับผลลัพธ์ตามนั้น แต่ฉันจะไม่เรียกมันว่าเป็นข้อผิดพลาด สำหรับกรณีของฉัน "ว่างถ้าไม่มีแท็ก" ถูกต้อง กรณีอื่น ๆ คนที่สามารถบันทึกลงในตัวแปรแล้วตรวจสอบว่ามันว่างเปล่า (เชื่อมโยงไปยังคำแนะนำทุบตี)
driftcatcher

23

git describeเป็นคำสั่งเครื่องเคลือบซึ่งคุณควรหลีกเลี่ยง:

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

ฉันใช้:

git name-rev --tags --name-only $(git rev-parse HEAD)

11
กำลังส่งคืน "undefined"
คนแปลกหน้า

4
การทำเช่นนี้จะส่งผลต่อท้าย^0สำหรับการกระทำที่สอดคล้องกับแท็ก (เช่นสำหรับการแท็ก1.0มันออก1.0^0) มีวิธีใดที่จะมีเอาต์พุต Git เท่านั้น1.0หรือฉันควรใช้สิ่งนี้
Daniel Serodio

13
เพียงแค่การวางแนวคิดบางอย่าง: ฉันคิดว่าคุณกลับความหมายของเครื่องเคลือบและท่อประปา มันตกลงที่จะใช้พอร์ซเลนมันเป็นระดับสูงและมีความหมายสำหรับการใช้งานปกติ Plumbing ist ภายใน (ตามชื่อที่แนะนำ) และไม่แนะนำเนื่องจากนักพัฒนา git ขอสงวนสิทธิ์ในการเปลี่ยนอาร์กิวเมนต์และเอาต์พุตโดยไม่มีการเตือน ดังนั้นคำแนะนำแรกของคุณคือคำแนะนำที่เหมาะสมกว่าเล็กน้อย
Leo Antunes

5
บทความที่เชื่อมโยงบอกว่าจะหลีกเลี่ยงการใช้ "สาขา git" เพราะมันไม่ทำงานสำหรับกรณีการใช้งาน ฉันไม่สามารถคิดเหตุผลที่ดีที่จะหลีกเลี่ยงการใช้คอมไพล์อธิบาย เช่นเดียวกับ Leo พูดคำสั่ง "Porcelain" เป็นคำสั่งที่คุณควรใช้โดยทั่วไป หลีกเลี่ยงคำสั่งการวางท่อเว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่ "git อธิบาย" ใช้งานได้ดี
Danny

4
คำสั่ง "Porcelain" เป็นคำสั่งที่คุณควรใช้ไม่ใช่คำสั่งที่คุณควรหลีกเลี่ยง พวกมันคือคำสั่งที่เอาท์พุทเป็นเครื่องที่อ่านได้และจะไม่เปลี่ยนแปลงในเวอร์ชันในอนาคตดังนั้นสามารถพึ่งพาได้ในสคริปต์ ฯลฯ คำสั่งที่ไม่ใช้พอร์ซเลนมีแนวโน้มที่จะสร้างเอาท์พุทที่มนุษย์อ่านได้มากขึ้น อ่านได้ไม่ใช่เพราะสิ่งที่สำคัญมีการเปลี่ยนแปลงจริง
rjmunro

22

เมื่อคุณตรวจสอบแท็กคุณมีสิ่งที่เรียกว่า"เฮดเดอเฮด" "หัวแฝด"โดยปกติ HEAD ของ Git จะเป็นตัวชี้ไปยังสาขาที่คุณได้เช็คเอาท์ อย่างไรก็ตามหากคุณตรวจสอบสิ่งอื่นนอกเหนือจากสาขาในพื้นที่ (เช่นแท็กหรือสาขาระยะไกลเป็นต้น) คุณมี "หัวเฮดเดอร์" - คุณไม่ได้อยู่ในสาขาใด ๆ คุณไม่ควรกระทำการใด ๆ ในขณะที่อยู่ในหัวที่แยกออก

คุณสามารถตรวจสอบแท็กได้หากคุณไม่ต้องการทำการแก้ไขใด ๆ หากคุณเพียงแค่ตรวจสอบเนื้อหาของไฟล์หรือคุณต้องการสร้างโครงการของคุณจากแท็กก็ไม่เป็นไรgit checkout my_tagและทำงานกับไฟล์ได้ตราบใดที่คุณไม่ให้กระทำการใดหากคุณต้องการเริ่มแก้ไขไฟล์คุณควรสร้างสาขาตามแท็ก:

$ git checkout -b my_tag_branch my_tag

จะสร้างสาขาใหม่ที่เรียกว่าเริ่มต้นจากmy_tag_branch my_tagการเปลี่ยนแปลงในสาขานี้ปลอดภัย


1
คำตอบที่ยอดเยี่ยม
Panos Filianos

9

git log --decorate

สิ่งนี้จะบอกคุณว่าผู้อ้างอิงที่ชี้ไปที่การกระทำที่ชำระเงินในขณะนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.