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>
và
git tag -a <tagname> -m '<message>'
Sự khác biệt giữa các lệnh này là gì?
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>
và
git tag -a <tagname> -m '<message>'
Sự khác biệt giữa các lệnh này là gì?
Câu trả lời:
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.
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:
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ẹ).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.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.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.
git tag -a <tag> -m ''
), nhưng thẻ chú thích luôn có thẻ (tác giả) và ngày .
git push --follow-tags
, chỉ các thẻ chú thích sẽ được đẩy.
Đẩ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 describe
không có tùy chọn dòng lệnh chỉ thấy các thẻ chú thíchSự khác biệt nội bộ
cả thẻ nhẹ và thẻ chú thích đều là một tệp .git/refs/tags
chứ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ếttag
đố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ẹ?
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ích là cá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ì và 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.