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 ):

$ git tag
v1.0
v2.0

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:

$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5

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 :

$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

-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 :

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

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ẻ:

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

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:

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

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:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme

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:

$ git tag -a v1.2 9fceb02

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

$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    Update rakefile
...

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> .

$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

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.

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

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:

$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

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> :

$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

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

$ git push origin --delete <tagname>

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.

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image

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:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

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