Sự khác biệt giữa thẻ chú thích và không được chú ý là gì?


331

Nếu tôi muốn gắn thẻ cam kết hiện tại. Tôi biết cả hai dòng lệnh sau hoạt động:

git tag <tagname>

git tag -a <tagname> -m '<message>'

Sự khác biệt giữa các lệnh này là gì?



1
@Thilo Đây không phải là một bản sao chính xác. Câu hỏi được tham khảo là về khi nào nên chú thích, không phải về các cờ liên quan.
Todd A. Jacobs

1
Điều này được giải thích rất rõ trong tài liệu của Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane

TLDR không được giám sát: cam kết; chú thích: cam kết, tác giả, ngày tháng, (tùy chọn) bình luận
Antony Hatchkins

Câu trả lời:


254

TL; DR

Sự khác biệt giữa các lệnh là một lệnh cung cấp cho bạn một thông báo thẻ trong khi lệnh còn lại thì không. Thẻ chú thích có một thông báo có thể được hiển thị bằng git-show (1), trong khi thẻ không có chú thích chỉ là một con trỏ được đặt tên cho một cam kết.

Thêm về các thẻ nhẹ

Theo tài liệu : "Để tạo thẻ nhẹ, không cung cấp bất kỳ tùy chọn -a, -s hoặc -m nào, chỉ cần cung cấp tên thẻ". Ngoài ra còn có một số tùy chọn khác nhau để viết tin nhắn trên các thẻ chú thích:

  • Khi bạn sử dụng git tag <tagname>, Git sẽ tạo một thẻ ở lần sửa đổi hiện tại nhưng sẽ không nhắc bạn chú thích. Nó sẽ được gắn thẻ mà không có tin nhắn (đây là một thẻ nhẹ).
  • Khi bạn sử dụng git tag -a <tagname>, Git sẽ nhắc bạn chú thích trừ khi bạn cũng đã sử dụng cờ -m để cung cấp một thông báo.
  • Khi bạn sử dụng git tag -a -m <msg> <tagname>, Git sẽ gắn thẻ cam kết và chú thích nó với thông báo được cung cấp.
  • Khi bạn sử dụng git tag -m <msg> <tagname>, Git sẽ hành xử như thể bạn đã chuyển cờ -a cho chú thích và sử dụng thông báo được cung cấp.

Về cơ bản, nó chỉ dựa vào việc bạn có muốn thẻ có chú thích và một số thông tin khác liên quan đến nó hay không.


4
Có sự khác biệt giữa thẻ "chú thích" và thông điệp cam kết không?
Steve Bennett

3
@SteveBennett Có. Một chú thích thẻ không phải là một thông điệp cam kết. Bạn không thể nhìn thấy nó với git-log (1); bạn cần sử dụng git-show (1).
Todd A. Jacobs

114
Sự khác biệt giữa các thẻ "chú thích" và "nhẹ" vượt xa thông điệp. Bạn có thể có thẻ chú thích mà không có thông báo ( git tag -a <tag> -m ''), nhưng thẻ chú thích luôn có thẻ (tác giả) và ngày .
Piotr Findeisen

1
Tương tự cho tôi. Thẻ phiên bản thường có các tin nhắn khá vô dụng (nó có thể nói nhiều hơn tên không? Để làm gì?). Thật không may, câu trả lời được bình chọn hàng đầu này không đề cập đến sự khác biệt này.
Piotr Findeisen

44
Một điều quan trọng khác cần lưu ý là khi bạn đẩy các thẻ của mình đến một kho lưu trữ từ xa bằng cách sử dụng git push --follow-tags, chỉ các thẻ chú thích sẽ được đẩy.
Xatoo

208

Đẩy các thẻ chú thích, giữ nhẹ cục bộ

man git-tag nói:

Các thẻ được chú thích có nghĩa là để phát hành trong khi các thẻ nhẹ có nghĩa là cho các nhãn đối tượng riêng tư hoặc tạm thời.

Và một số hành vi nhất định phân biệt giữa chúng theo cách mà khuyến nghị này hữu ích, ví dụ:

  • các thẻ chú thích có thể chứa một thông điệp, người tạo và ngày khác với cam kết mà họ trỏ đến. Vì vậy, bạn có thể sử dụng chúng để mô tả một bản phát hành mà không cần thực hiện một cam kết phát hành.

    Các thẻ nhẹ không có thêm thông tin đó và không cần nó, vì bạn sẽ chỉ sử dụng nó để phát triển.

  • git push --follow-tags sẽ chỉ đẩy các thẻ có chú thích
  • git describe không có tùy chọn dòng lệnh chỉ thấy các thẻ chú thích

Sự khác biệt nội bộ

  • cả thẻ nhẹ và thẻ chú thích đều là một tệp .git/refs/tagschứa SHA-1

  • đối với các thẻ nhẹ, SHA-1 trỏ trực tiếp vào một cam kết:

    git tag light
    cat .git/refs/tags/light
    

    in giống như SHA-1 của ĐẦU.

    Vì vậy, không có gì lạ khi họ không thể chứa bất kỳ siêu dữ liệu nào khác.

  • các thẻ chú thích trỏ đến một đối tượng thẻ trong cơ sở dữ liệu đối tượng.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    chứa SHA của đối tượng thẻ chú thích:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    và sau đó chúng ta có thể lấy nội dung của nó với:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    đầu ra mẫu:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    Và đây là cách nó chứa siêu dữ liệu bổ sung. Như chúng ta có thể thấy từ đầu ra, các trường siêu dữ liệu là:

    Một phân tích chi tiết hơn về định dạng được trình bày tại: Định dạng của đối tượng thẻ git là gì và cách tính SHA của nó?

Tiền thưởng

  • Xác định nếu một thẻ được chú thích:

    git cat-file -t tag
    

    Đầu ra

    • commit đối với trọng lượng nhẹ, vì không có đối tượng thẻ, nó trỏ trực tiếp vào cam kết
    • tag đối với chú thích, vì có một đối tượng thẻ trong trường hợp đó
  • Chỉ liệt kê các thẻ nhẹ: Làm thế nào tôi có thể liệt kê tất cả các thẻ nhẹ?


1
Điều này rõ ràng hơn nhiều so với câu trả lời hiện đang được chấp nhận. Cảm ơn.
lừa

43

Sự khác biệt lớn được giải thích hoàn hảo ở đây .

Về cơ bản, các thẻ nhẹ chỉ là con trỏ đến các cam kết cụ thể. Không có thêm thông tin được lưu ; mặt khác, các thẻ chú thíchcác đối tượng thông thường , có tác giả và ngày tháng và có thể được giới thiệu vì chúng có khóa SHA riêng.

Nếu biết ai đã gắn thẻ những gìkhi nào có liên quan đến bạn, thì hãy sử dụng các thẻ chú thích. Nếu bạn chỉ muốn gắn thẻ một điểm cụ thể trong sự phát triển của bạn , bất kể ai và khi nào đã làm điều đó, thì các thẻ nhẹ là đủ tốt.

Thông thường, bạn sẽ sử dụng các thẻ chú thích, nhưng nó thực sự phụ thuộc vào chủ nhân Git của dự án.

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.