Domain 2 · 9 phút đọc

Cất tạm với git stash và đánh dấu với git tag

Stashing Changes and Tagging Releases

Hai công cụ hữu ích cho công việc hằng ngày: git stash giúp bạn cất tạm thay đổi dang dở để làm việc khác, còn git tag giúp đánh dấu một commit là một phiên bản phát hành. Bài này gộp cả hai.

git stash: cất tạm thay đổi

Đang sửa dở thì cần chuyển nhánh gấp để vá lỗi, nhưng chưa muốn commit code chưa xong? git stash cất mọi thay đổi chưa commit vào một ngăn riêng và trả working directory về sạch:

# Cất tạm mọi thay đổi chưa commit
git stash

# Cất kèm ghi chú để dễ nhận ra
git stash push -m "đang làm form login"

Sau khi stash, git status sẽ sạch — bạn tự do chuyển nhánh, pull, v.v.

Lấy lại và quản lý stash

# Xem danh sách các stash đã cất
git stash list

# Áp lại stash mới nhất VÀ xóa nó khỏi danh sách
git stash pop

# Áp lại nhưng GIỮ trong danh sách
git stash apply

# Xóa stash mới nhất
git stash drop
LệnhTác dụng
git stashCất thay đổi, làm sạch working dir
git stash listLiệt kê các stash (stash@{0}, {1}…)
git stash popÁp lại và xóa khỏi danh sách
git stash applyÁp lại nhưng giữ trong danh sách

Mẹo

stash là một ngăn xếp stack: stash mới nhất là stash@{0}. Bạn có thể cất nhiều lần và áp lại đúng cái cần: git stash pop stash@{2}.

git tag: đánh dấu phiên bản

Tag là một cái tên cố định gắn vào một commit cụ thể, thường để đánh dấu một bản phát hành (release) như v1.0.0. Khác với nhánh, tag không di chuyển khi có commit mới.

Có hai loại tag:

Lightweight tag

Chỉ là một con trỏ trỏ tới commit, không kèm thông tin gì thêm:

# Tạo lightweight tag
git tag v1.0.0

Annotated tag

Là một đối tượng đầy đủ trong Git: chứa người tạo, ngày giờ, message — và có thể ký số. Đây là loại được khuyến nghị cho release:

# Tạo annotated tag với message
git tag -a v1.0.0 -m "Phát hành bản 1.0.0"
LoạiLưu thông tin tác giả/ngày/messageDùng cho
LightweightKhôngĐánh dấu tạm, riêng
AnnotatedRelease chính thức

Push tag lên remote

Lưu ý quan trọng: git push thường không tự đẩy tag. Phải đẩy riêng:

# Đẩy một tag cụ thể
git push origin v1.0.0

# Đẩy tất cả tag chưa có trên remote
git push origin --tags

Trọng tâm thi

Phân biệt lightweight tag (chỉ con trỏ) và annotated tag (-a, có tác giả/ngày/message — nên dùng cho release). git push không tự đẩy tag; cần git push origin <tag> hoặc --tags.

Tóm tắt

  • git stash cất tạm thay đổi chưa commit, trả working directory về sạch; pop áp lại và xóa, apply áp lại và giữ.
  • git stash list xem các stash; stash hoạt động như một ngăn xếp stash@{n}.
  • git tag đánh dấu commit là một phiên bản; tag không di chuyển theo commit mới.
  • Lightweight tag chỉ là con trỏ; annotated tag (-a) có tác giả/ngày/message, nên dùng cho release.
  • Tag không tự được push: dùng git push origin <tag> hoặc git push origin --tags.