Git Pro: Những thao tác cơ bản khi làm việc với Git (P3) – Tagging

2.5 Gắn thẻ – Tagging

Tagging

Giống như hầu hết các VCS, Git có khả năng gắn thẻ các mốc cụ thể trong lịch sử của kho lưu trữ. Thông thường, mọi người sử dụng chức năng này để đánh dấu các mốc release ( v1.0 , v2.0 , v.v.). Trong phần này, chúng ta sẽ tìm hiểu cách liệt kê, tạo và xóa các thẻ, tìm hiểu sự khác nhau giữa các thẻ.

Liệt kê các thẻ của bạn

Liệt kê các thẻ hiện có trong Git rất đơn giản. Chỉ cần nhập git tag (với tùy chọn -l hoặc --list ):

Lệnh này liệt kê các thẻ theo thứ tự bảng chữ cái.

Bạn cũng có thể tìm kiếm các thẻ với điều kiện cụ thể. Ví dụ, kho dữ liệu Git chứa hơn 500 thẻ. Nếu bạn chỉ quan tâm đến series 1.8.5, bạn có thể chạy lệnh:

Tạo thẻ

Git hỗ trợ hai loại thẻ: lightweight và annotated (thẻ chú thích).

lightweight tag giống với một nhánh không thay đổi – nó chỉ trỏ tới một commit cụ thể.

Thẻ Annotated được lưu trữ dưới dạng các đối tượng đầy đủ trong cơ sở dữ liệu Git. Chứa tên tagger, email và ngày; một thông điệp gắn thẻ; và có thể được đánh dấu và xác nhận với GNU Privacy Guard (GPG). Nói chung, bạn nên tạo các thẻ chú thích để có tất cả các thông tin này; Nếu bạn muốn một thẻ tạm hoặc không muốn giữ một số thông tin bạn có thể dùng các thẻ lightweight.

Thẻ chú thích – Annotated Tags

Tạo một thẻ chú thích trong Git rất đơn giản. Cách dễ nhất là chỉ định -a khi bạn chạy lệnh tag :

-m chỉ định một thông báo gắn thẻ và được lưu trữ cùng với thẻ. Nếu bạn không chỉ định thông báo cho thẻ chú thích, Git sẽ khởi chạy trình chỉnh sửa để bạn có thể nhập nó vào.

Bạn có thể thấy dữ liệu thẻ cùng với commit đã được gắn thẻ bằng cách sử dụng git show :

Nó cho thấy thông tin thẻ, ngày commit được gắn thẻ và thông báo chú thích trước khi hiển thị thông tin commit.

Thẻ lightweight

Về cơ bản, đây là tổng kiểm tra commit được lưu trữ trong một tệp – không có thông tin nào khác được lưu giữ. Khi tạo thẻ lightweight, ta không cần cung cấp bất kỳ tùy chọn -a , -s hoặc -m nào mà chỉ cần cung cấp tên thẻ:

Nếu bạn chạy git show tên thẻ, bạn sẽ không thấy thông tin thẻ phụ. Lệnh chỉ hiển thị commit:

Gắn thẻ 

Bạn cũng có thể gắn thẻ commit sau khi bạn di chuyển qua chúng. Giả sử lịch sử commit của bạn như thế này:

Giả sử bạn đã quên gắn thẻ dự án v1.2, đó là commit “Update rakefile”. Bạn có thể thêm nó sau. Để gắn thẻ commit đó, bạn chỉ định commit ( toàn bộ hoặc một phần) ở cuối lệnh:

Bạn có thể thấy rằng bạn đã gắn thẻ commit:

Thẻ chia sẻ

Theo mặc định, git push không chuyển các thẻ vào các server remote. Bạn sẽ phải đẩy các thẻ đến một serve shared sau khi bạn đã tạo chúng. Quá trình này giống như chia sẻ các branch remote – bạn có thể chạy git push origin <tagname> .

Nếu bạn có nhiều thẻ muốn đẩy lên cùng một lúc, bạn có thể sử dụng tùy chọn --tags cho git push . Lệnh sẽ chuyển tất cả các thẻ của bạn đến server remote.

Giờ đây, khi người khác clone hoặc pull từ kho lưu trữ của bạn, họ cũng sẽ nhận được tất cả các thẻ của bạn.

Xóa các thẻ

Để xóa thẻ trên kho lưu trữ local của bạn, bạn có thể sử dụng git tag -d <tagname> . Ví dụ: ta có thể xóa thẻ lightweight ở trên như sau:

Lưu ý rằng lệnh này không xóa thẻ khỏi bất kỳ server remote nào. Có hai cách phổ biến để xóa thẻ từ server remote.

Đầu tiên là git push <remote> :refs/tags/<tagname> :

Cách thứ hai ( trực quan hơn) là:

Checking out Tags

Nếu bạn muốn xem các version của tệp mà thẻ đang trỏ tới, bạn thực hiện git checkout thẻ đó, việc này đưa kho lưu trữ của bạn vào “detached HEAD” – có một vài tác dụng không được tốt cho lắm.

Trong “detached HEAD”, nếu bạn thực hiện các thay đổi và sau đó tạo một commit, thẻ sẽ giữ nguyên, nhưng commit mới của bạn sẽ không thuộc về bất kỳ nhánh nào và sẽ không thể truy cập được trừ hàm băm chính xác của commit. Vì vậy, nếu bạn cần thực hiện các thay đổi – ví dụ: bạn đang sửa một lỗi trên version cũ – bạn sẽ muốn tạo một nhánh:

Nếu bạn làm như trên và thực hiện commit, nhánh version2 của bạn sẽ khác so với thẻ v2.0.0 vì nó phát triển với những thay đổi mới của bạn, vậy nên hãy cẩn thận khi dùng nó.

Add a Comment

Your email address will not be published.