Hiển thị thẻ git nào bạn đang sử dụng?


216

Tôi đang gặp khó khăn khi tìm ra thẻ nào hiện đang được kiểm tra.

Khi tôi làm:

git checkout tag1
git branch

Tôi dường như không thể tìm ra thẻ nào tôi đang sử dụng. Nó chỉ ghi nhật ký:

* (no branch)
master

Có thể tìm ra những thẻ được kiểm tra? Trong ví dụ trên, điều này sẽ là tag1.

Câu trả lời:


326

Chỉnh sửa : Jakub Narębski có nhiều git-fu. Lệnh đơn giản hơn nhiều sau đây hoạt động hoàn hảo:

git describe --tags

(Hoặc không có --tagsnếu bạn đã kiểm tra thẻ chú thích. Thẻ của tôi rất nhẹ, vì vậy tôi cần --tags.)

câu trả lời ban đầu sau:

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

Ai đó có nhiều git-fu có thể có một giải pháp thanh lịch hơn ...

Điều này thúc đẩy thực tế là git-logbáo cáo nhật ký bắt đầu từ những gì bạn đã kiểm tra. %hin băm viết tắt. Sau đó git describe --exact-match --tagstìm thẻ (nhẹ hoặc chú thích) khớp chính xác với cam kết đó.

Các $()cú pháp trên giả định bạn đang sử dụng bash hoặc tương đương.


22
Chỉ cần sử dụng git describesẽ hiển thị tên thẻ nếu bạn chính xác trên thẻ (chú thích) hoặc <tag>-<n>-g<shortened sha-1>nếu không, <n>số lần xác nhận là từ đâu <tag>.
Jakub Narębski

1
@Jakub - Cảm ơn. Tôi đã thêm vào --exact-matchcâu trả lời của tôi vài giây trước khi bình luận của bạn. Rất vui khi biết rằng bạn có thể xóa nó và vẫn nhận được thông tin tốt từ đầu vào mờ hơn.
bstpierre

Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm. Btw, thậm chí git-description --exact-match (không có --tags) hoạt động với tôi.
grm

3
Sử dụng git rev-parse HEADlà một giải pháp tốt hơn git log -n1 --pretty='%h'... nhưng tại sao bạn không thể đơn giản viết HEAD(hoặc không có gì, như git describemặc định cho CHÍNH)?
Jakub Narębski

chỉ có Guybrush ghét đồ sứ
vdegenne

71

Điều này làm việc cho tôi git describe --tags --abbrev=0


2
Đúng. Điều này hoạt động ngay cả khi bạn không chính xác trên thẻ đó! :)
Martin Muzatko

13
Ừm. ... Nếu bạn kiểm tra băm ba lần xác nhận sau thẻ, bạn không "trên thẻ đó". Nó cho bạn biết thẻ cuối cùng trước hoặc tại cam kết đã được kiểm tra. Vì vậy, điều này là không chính xác.
ingyhere

Cũng hoạt động trên Windows :)
cowlinator

49

Hiển thị tất cả các thẻ trên CHÍNH hiện tại (hoặc cam kết)

git tag --points-at HEAD

1
Lưu ý rằng lệnh này không báo cáo lỗi tại dòng lệnh ngay cả khi kết quả xuất hiện trống. Bọ cánh cứng? Nó cũng trả về một danh sách nếu có nhiều thẻ tại vị trí đó. Đó là câu trả lời tốt nhất nhưng các nhà viết kịch bản nên tiến hành thận trọng ghi nhớ những cảnh báo này.
ingyhere

Theo dõi bình luận của @ ingyhere. Có, thông tin tốt là nó không có lỗi và mọi người cần xử lý kết quả tương ứng. Nhưng tôi sẽ không gọi nó là một lỗi. Đối với trường hợp của tôi, "trống nếu không có thẻ" là hợp lệ. Các trường hợp khác, ai đó có thể lưu nó vào một biến sau đó kiểm tra xem nó có trống không (liên kết đến các hướng dẫn bash)
driftcatcher

23

git describelà một lệnh sứ , mà bạn nên tránh:

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

Thay vào đó, tôi đã sử dụng:

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

11
Nó đang trở lại "không xác định"
Stranger

4
Điều này xuất ra một dấu vết ^0cho các cam kết tương ứng với các thẻ (ví dụ: đối với thẻ 1.0nó xuất ra 1.0^0). Có cách nào chỉ có đầu ra Git không 1.0, hay tôi nên sử dụng sed cho việc này?
Daniel Serodio

13
Chỉ là một số khái niệm nitpicking: Tôi nghĩ rằng bạn đã đảo ngược ý nghĩa của sứ và hệ thống ống nước. Sử dụng sứ là ổn, mức độ cao và có nghĩa là sử dụng bình thường . Hệ thống nước ist nội bộ (như tên cho thấy) và chỉ không được khuyến nghị vì các nhà phát triển git có quyền thay đổi đối số và đầu ra của họ mà không cần cảnh báo. Vì vậy, đề nghị đầu tiên của bạn thực sự là một chút thích hợp hơn.
Leo Antunes

5
Bài viết được liên kết nói để tránh sử dụng "nhánh git" vì nó không hoạt động cho trường hợp sử dụng này. Tôi không thể nghĩ ra bất kỳ lý do chính đáng nào để tránh sử dụng mô tả git. Giống như Leo nói, các lệnh "Sứ" là các lệnh bạn thường sử dụng. Tránh các lệnh hệ thống ống nước trừ khi bạn thực sự biết những gì bạn đang làm. "Git mô tả" hoạt động tuyệt vời.
Daniel

4
Lệnh "Sứ" là những lệnh bạn nên sử dụng, không phải là lệnh bạn nên tránh. Chúng là các lệnh có đầu ra có thể đọc được bằng máy và sẽ không thay đổi trong các phiên bản trong tương lai, do đó có thể dựa vào các tập lệnh, v.v. Các lệnh không bằng sứ có xu hướng tạo ra đầu ra dễ đọc hơn cho con người, nhưng nó có thể thay đổi trong các phiên bản trong tương lai, ví dụ như để làm cho nó nhiều hơn có thể đọc được, không phải vì một cái gì đó quan trọng đã thực sự thay đổi.
rjmunro

22

Khi bạn kiểm tra một thẻ, bạn có cái gọi là "đầu tách ra" . Thông thường, cam kết CHÍNH của Git là một con trỏ tới nhánh mà bạn hiện đã kiểm tra. Tuy nhiên, nếu bạn kiểm tra thứ gì đó không phải là chi nhánh địa phương (ví dụ: thẻ hoặc chi nhánh từ xa), bạn có "đầu tách rời" - bạn không thực sự ở bất kỳ chi nhánh nào. Bạn không nên thực hiện bất kỳ cam kết nào trong khi trên một đầu tách ra.

Bạn có thể kiểm tra thẻ nếu bạn không muốn thực hiện bất kỳ chỉnh sửa nào. Nếu bạn chỉ kiểm tra nội dung của các tệp hoặc bạn muốn xây dựng dự án của mình từ thẻ, bạn có thể git checkout my_taglàm việc với các tệp đó, miễn là bạn không thực hiện bất kỳ cam kết nào . Nếu bạn muốn bắt đầu sửa đổi các tệp, bạn nên tạo một nhánh dựa trên thẻ:

$ git checkout -b my_tag_branch my_tag

sẽ tạo ra một nhánh mới gọi là my_tag_branchbắt đầu từ my_tag. An toàn để cam kết thay đổi trên chi nhánh này.


1
Câu trả lời tuyệt vời.
Panos Filianos

9

git log --decorate

Điều này sẽ cho bạn biết những gì giới thiệu đang trỏ đến cam kết hiện đang được kiểm tra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.