2010-08-04 29 views
122

Tôi đang gặp sự cố khi tìm ra thẻ hiện được kiểm tra.Cho biết bạn đang sử dụng thẻ git nào?

Khi tôi làm:

git checkout tag1 
git branch 

tôi dường như không thể tìm ra từ khóa Tôi đang trên. Chỉ ghi nhật ký:

* (no branch) 
master 

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

Trả lời

196

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

git describe --tags 

(Hoặc nếu không có sự --tags nếu bạn đã kiểm tra ra một thẻ chú thích thẻ của tôi là 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') 

người với hơn 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-log báo cáo nhật ký bắt đầu từ những gì bạn đã kiểm tra. %h in băm viết tắt. Sau đó, git describe --exact-match --tags tìm thẻ (có trọng lượng nhẹ hoặc được chú thích) khớp chính xác với cam kết đó.

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

+12

Chỉ cần sử dụng 'git describe' sẽ hiển thị tên thẻ nếu bạn là chính xác vào (chú thích) thẻ, hoặc ' - -g ' nếu không, trong đó '' là số lần commit từ ''. –

+1

@Jakub - Cảm ơn. Tôi đã thêm '--exact-match' vào câu trả lời của tôi vài giây trước 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ờ. – bstpierre

+0

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

18

Khi bạn kiểm tra thẻ, bạn có tên gọi là "detached head". Thông thường, commit của Git HEAD 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 một cái gì đó khác với một chi nhánh địa phương (một thẻ hoặc một chi nhánh từ xa, ví dụ) bạn có một "đầu tách" - bạn không thực sự trên bất kỳ chi nhánh. Bạn không nên thực hiện bất kỳ cam kết trong khi trên một đầu tách rời.

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 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_tag và là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 file, bạn nên tạo một chi nhánh dựa trên thẻ:

$ git checkout -b my_tag_branch my_tag 

sẽ tạo ra một chi nhánh mới gọi là my_tag_branch bắt đầu từ my_tag. Sẽ an toàn khi thực hiện các thay đổi trên nhánh này.

18

git describe là một lệnh porcelain, mà bạn nên tránh:

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

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

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

Nó trả về "không xác định" – Stranger

+3

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

+0

@DanielSerodio này làm việc cho tôi trong bash với sed cài đặt: 'git name-rev --tags --name-only $ (git rev-parse HEAD) | sed 's | \ ([^ \ ^] * \) \ (\^0 \) $ | \ 1 | g'' – hobs

7

git log --decorate

này sẽ cho bạn biết những gì refs được trỏ đến cam kết hiện đã được kiểm tra.

24

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

+1

Người duy nhất làm việc! cảm ơn –

+0

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

+2

Uhhh. ... Nếu bạn thanh toán băm ba lần commit sau thẻ, bạn không phải "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

17

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

git tag --points-at HEAD 
+0

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. Lỗi? 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 hay nhất nhưng người viết kịch bản nên tiến hành thận trọng khi lưu ý những điều này. – ingyhere

Các vấn đề liên quan