Làm web (10) - Git: đánh dấu

Bài học trước: Làm web (09) - Git: thao tác với remote repo (tt)
-----

3.6        Đánh dấu


Git cho phép đánh dấu (tag) các mốc quan trọng trong lịch sử của dự án, ví dụ các thời điểm phát hành phiên bản của dự án, như v1.0, v1.1.

Xem danh sách các tag

Để xem danh sách các tag sử dụng lệnh $ git tag. Ví dụ,

$ git tag       
v1.0
v1.1
v1.2
v1.3
v1.4-lw

Lệnh này sẽ hiển thị danh sách các tag theo thứ tự bảng chữ cái.

Thực tế, một kho chứa sẽ có rất nhiều tag, do vậy, bạn có thể lọc các tag để hiển thị bằng cách sử dụng mẫu (pattern). Ví dụ, chỉ hiển thị các tag có chuỗi bắt đầu là v1, (-l là viết tắt của --list)

$ git tag -l 'v1.*'
v1.0
v1.1
v1.2
v1.3
v1.4-lw

Xem thông tin một Tag

Sử dụng lệnh $ git show [tên tag] để xem thông tin của một tag, thông tin gồm: người tag, ngày tag, thông điệp, thông tin về commit.

Ví dụ,

$ git show v1.3
tag v1.3
Tagger: Lê Gia Công <legiacong@gmail.com>
Date:   Tue Mar 19 19:28:45 2019 +0700

phien ban 1.3

commit a89362ebd9224568e65afdfcacd9a4a6a3b30d8d (HEAD -> master, tag: v1.3, tag: v1.2, tag: v1.1, tag: v1.0, origin/master, origin/HEAD)
Author: legiacong <legiacong@gmail.com>
Date:   Fri Mar 15 16:16:55 2019 +0700

    Update testdesktop.txt

diff --git a/testdesktop.txt b/testdesktop.txt
index 994c3d7..94fdb0a 100644
--- a/testdesktop.txt
+++ b/testdesktop.txt
@@ -1 +1,2 @@
-?sncdfdfd
\ No newline at end of file
+?sncdfdfd
+ hkhk

Thêm tag

Git có hai loại tag là lightweight và annotated.

– lightweight: giống như một nhánh (branch) nhưng không có thay đổi, nó chỉ là một con trỏ, trỏ tới một commit

– annotated: được lưu trữ trong cơ sở dữ liệu của Git như một đối tượng đầy đủ; nó được băm (hash); chứa tên người tag, địa chỉ email và ngày tháng; có thông điệp đi kèm; có thể được ký và xác thực bằng GNU privacy Guard (GPG).

Thông thường annotated được khuyến khích sử dụng do có nhiều thông tin hơn. Tuy nhiên, nếu chỉ muốn tag tạm thời hoặc không muốn lưu trữ thông tin như một đối tượng thì nên sử dụng tag kiểu lightweight.

Tag annotated

Để thêm tag kiểu annotated sử dụng lệnh $ git tag với tham số -a, ví dụ,

$ git tag -a v1.3 -m "phien ban 1.3"

Tham số -m dùng để tạo thông điệp cho tag, nếu không sử dụng tham số -m và không có thông điệp đi kèm, lệnh trên sẽ mở cửa sổ soạn thảo để bạn nhập thông điệp.

Tag lightweight

Đây là cách thứ hai để tạo tag cho một commit. Để tạo tag kiểu này, Git sẽ lấy mã băm của commit và lưu vào một tập tin. Lệnh để tạo là $ git tag [tên của tag]. Lưu ý là không có thêm các tham số -a, -s, hay -m giống như khi tạo một tag annotated.

Ví dụ,

$ git tag v1.4-lw

Khi xem thông tin của tag v1.4-lw sẽ không thấy có thông tin về người tag, ngày tag và thông điệp.

Ví dụ,

$ git show v1.4-lw
commit a89362ebd9224568e65afdfcacd9a4a6a3b30d8d (HEAD -> master, tag: v1.4-lw, tag: v1.3, tag: v1.2, tag: v1.1, tag: v1.0, origin/master, origin/HEAD)
Author: legiacong <legiacong@gmail.com>
Date:   Fri Mar 15 16:16:55 2019 +0700

    Update testdesktop.txt
 …

Tag muộn

Bạn có thể tạo tag cho các commit đã được thực hiện trước đó. Thử xem lịch sử commit của một kho chứa có nội dung như sau,

$ git log --pretty=oneline

a89362ebd9224568e65afdfcacd9a4a6a3b30d8d (HEAD -> master, tag: v1.4-lw, tag: v1.3, tag: v1.2, tag: v1.1, tag: v1.0, origin/master, origin/HEAD) Update testdesktop.txt
c2aa7297c78eeabf98abf6dede2bf1da9ec252e1 Add files via upload
a31e6f175ca84e6dd9fb8b8d636d50aeda33e8ad conglg them mot tap tin
abaf96485d1c1f3247be9b8f1d1ea1c4e8b2b626 commit lan 1 amend
6b49bd01d35a7043604435b39d2facdd0a0dc800 add noi dung 83_git commit amend thêm m?i
9a99d676b551666a057a35c9dfa7067079f3bb6f them mot tap tin 8thang3
0cf8354bcbd0ad93ebf5bf336f3e49a47a00d8f4 doi ten tap tin
a6c7b4268d5c421c6fe1b6e444bcff8abeb89c19 doi ten

Giả sử bạn quên không tag cho dự án với phiên bản là v1.4 tại commit có thông điệp là “doi ten tap tin”. Bạn vẫn có thể tạo tag tại thời điểm này bằng cách thêm mã băm (hoặc một phần mã băm) vào cuối lệnh tạo tag.

Ví dụ,

$ git tag -a v1.4 -m "Phien ban 1.4" 0cf8354

Kiểm tra lại, sẽ thấy commit đã được tag,

$ git tag
v1.0
v1.1
v1.2          
v1.3
v1.4
v1.4-lw
$ git show v1.4
tag v1.4
Tagger: Lê Gia Công <legiacong@gmail.com>
Date:   Wed Mar 20 20:57:36 2019 +0700

Phien ban 1.4

commit 0cf8354bcbd0ad93ebf5bf336f3e49a47a00d8f4 (tag: v1.4)
Author: Lê Gia Công <legiacong@gmail.com>
Date:   Wed Mar 6 15:47:47 2019 +0700

    doi ten tap tin

Chia sẻ tag

Khi bạn thực hiện đẩy local repo lên remote repo, các tag sẽ không được gửi lên, mà bạn cần phải thực hiện thêm công việc gửi tag lên remote repo nếu muốn chia sẻ cho người khác.

Để đẩy tag lên remote repo, sử dụng lệnh $ git push origin <tên tag>.

Ví dụ,

$ git push origin v1.4
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 174 bytes | 43.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/legiacong/langbiang.git
 * [new tag]         v1.4 -> v1.4

Nếu muốn đẩy một lần tất cả các tag lên remote repo thì sử dụng thêm tham số --tags, lệnh này sẽ đẩy lên remote repo tất cả các tag mà remote repo chưa có.

Ví dụ,

$ git push origin --tags
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 319 bytes | 106.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/legiacong/langbiang.git
 * [new tag]         v1.0 -> v1.0
 * [new tag]         v1.1 -> v1.1
 * [new tag]         v1.2 -> v1.2
 * [new tag]         v1.3 -> v1.3
 * [new tag]         v1.4-lw -> v1.4-lw

Xóa tag

Để xóa tag tại local repo, sử dụng lệnh $ git tag -d <tên tag>.

Ví dụ,

$ git tag -d v1.0
Deleted tag 'v1.0' (was af50413)

Lệnh trên chỉ xóa được tag tại local repo, muốn xóa tag tại remote repo có thể sử dụng một trong hai cách sau:

Cách một (bản chất của cách này là đẩy một tag không có nội dung về remote repo–để ý khoảng trắng trước dấu :),

$ git push <remote repo> :refs/tags/<tên tag>

Ví dụ,

 $ git push origin :refs/tags/v1.0
To https://github.com/legiacong/langbiang.git
 - [deleted]         v1.0

Cách hai,

$ git push origin --delete <tên tag>

Ví dụ,

$ git push origin --delete v1.2
To https://github.com/legiacong/langbiang.git
 - [deleted]         v1.2

Check out theo tag

Nếu muốn xem nội dung của các tập tin tại một thời điểm đặt tag, và chuyển con trỏ của Git (HEAD) về thời điểm tương ứng, sử dụng lệnh $ git checkout <tên tag>

Ví dụ,

$ git checkout v1.1
Note: checking out 'v1.1'.

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

HEAD is now at a89362e Update testdesktop.txt

Lệnh trên sẽ đặt kho chứa ở tình trạng “detached HEAD”, hiểu nôm na là tình trạng mất định hướng. Trong tình trạng “detached HEAD”, nếu bạn thực hiện thay đổi kho chứa và commit, tag vẫn giữ nguyên, nhưng commit sẽ không thuộc vào bất kỳ nhánh nào, và bạn không có cách nào để truy cập được tới commit trừ mã băm của nó. Giải pháp trong trường hợp này là tạo một nhánh mới.

Ví dụ,

$ git checkout -b phienban1 v1.1
Switched to a new branch 'phienban1'

Khi đó, những thay đổi trên nhánh phienban1 (nếu được commit) sẽ làm cho nội dung của kho chứa khác đi so với thời điểm tag v1.1.

3.7        Phím tab và Git alias


Phím tab

Trong khi gõ lệnh Git bằng Git Bash trong Windows, có nhiều lệnh bạn sẽ không thể nhớ chính xác, hãy bấm phím tab hai lần để có được các gợi ý nhắc lệnh.

Ví dụ, bạn muốn gõ lệnh git commit nhưng bạn không nhớ chữ commit, trong trường hợp như vậy bạn chỉ cần gõ $ git com <tab><tab>, Git sẽ hiển thị các gợi ý cho bạn

$ git co
commit   config
Sau đó bạn gõ thêm chữ m và <tab> để hoàn thành lệnh.
Ví dụ, khi bạn cần gõ các tham số, $ git log --s <tab> <tab>
$ git log --s
--shortstat                --since=                   --submodule
--show-signature           --sparse                   --submodule=
--simplify-by-decoration   --src-prefix=              --summary
--simplify-merges          --stat

Alias

Để gõ lệnh nhanh có thể gán cho lệnh các tên mới ngắn gọn hơn, hoặc dễ nhớ hơn. Ví dụ, thay vì phải gõ lệnh là $ git checkout, thì chỉ cần gõ là $ git co.

Cách làm,

$ git config --global alias.co checkout

Một số ví dụ khác,

$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

Có thể mở tập tin .gitconfig hoặc dùng lệnh git config --list để xem kết quả trong tập tin cấu hình.


Lab 24. Thao tác với Tag.

– Làm việc theo nhóm

– Giả định nhóm đã có một remote repo (trên Github hoặc Gitlab)

– Mỗi thành viên cập nhật remote repo về local repo (clone hoặc pull)

– Trên local repo, mỗi thành viên chỉnh sửa/thêm dữ liệu để thực hiện 3 commit và đặt 3 tag (2 kiểu annotated, 1 kiểu lightweight)

– Đẩy local repo lên remote repo

– Đẩy các tag lên remote repo

– Thực hiện các thao tác: tag muộn, xóa tag trên local repo, xóa tag trên remote repo, check out theo tag

– Kéo remote repo về máy để xem kết quả liên quan đến tag

– Sử dụng phím tab cho chức năng nhắc lệnh

– Đặt tên mới cho một số lệnh (alias)


</////10
-----------
Cập nhật [21/3/2019]
-----------
Xem thêm: Tổng hợp các bài viết về Làm web
Xem thêm: Làm web (11) - Git: tạo nhánh