Skip to content

2. Stash (Kho tạm)

NOTE

SCENARIO: Bạn đang viết dở tính năng Login (code nát bét, chưa chạy được) trên branch feat/login. Sếp chạy vào hét: "Web sập rồi! Sửa ngay!". Bạn không thể commit code dở dang được (vi phạm HPN's Rule #2). Bạn cũng không muốn xóa code đi viết lại.

2.1 Cất đi để làm việc khác (git stash)

Stash giống như ngăn kéo bàn làm việc. Bạn quét sạch đống lộn xộn trên bàn ném vào ngăn kéo để mặt bàn sạch sẽ.

bash
git stash
# Hoặc đặt tên cho dễ nhớ:
git stash save "dang lam do login"

Lúc này git status sẽ báo "Clean". Bạn có thể an tâm switch sang branch hotfix để sửa lỗi.


2.2 Lấy lại code cũ (git stash pop)

Sau khi fix bug xong, quay lại branch cũ và mở ngăn kéo ra.

bash
git stash pop

Lệnh này sẽ lấy code từ Stash đắp lại vào Working Directory và xóa luôn bản backup trong Stash.

2.3 Quản lý Stash

Nếu bạn là người bừa bộn (stash quá nhiều lần), hãy kiểm tra danh sách:

bash
git stash list
# stash@{0}: On feature/login: dang lam do login
# stash@{1}: On master: fix header

Apply một stash cụ thể (không xóa khỏi list):

bash
git stash apply stash@{0}

TIP

Đừng lạm dụng Stash thay cho Commit. Stash là bộ nhớ tạm (Temporary Buffer), không phải nơi lưu trữ lâu dài.

🧠 Quiz

Câu 1: git stash lưu tạm những thay đổi nào?

  • [ ] A) Chỉ file đã staged
  • [ ] B) Chỉ file chưa staged
  • [x] C) Cả file đã staged lẫn chưa staged (tracked files)
  • [ ] D) Tất cả file kể cả untracked

💡 Giải thích: Mặc định git stash lưu tạm cả staged và unstaged changes của tracked files. Để bao gồm untracked files, dùng git stash -u. File trong .gitignore cần flag -a.

Câu 2: Sự khác biệt giữa git stash popgit stash apply là gì?

  • [ ] A) pop áp dụng stash cũ nhất, apply áp dụng stash mới nhất
  • [x] B) pop áp dụng và xóa stash khỏi list, apply áp dụng nhưng giữ stash trong list
  • [ ] C) pop chỉ hoạt động với stash@{0}, apply hoạt động với mọi stash
  • [ ] D) Không có sự khác biệt

💡 Giải thích: git stash pop = apply + drop (áp dụng stash rồi xóa khỏi danh sách). git stash apply chỉ áp dụng mà giữ nguyên stash trong list, hữu ích khi muốn apply cùng stash vào nhiều branch.

Câu 3: Tại sao không nên lạm dụng Stash thay cho Commit?

  • [ ] A) Vì stash có giới hạn 10 entries
  • [ ] B) Vì stash không thể lưu binary files
  • [x] C) Vì stash là bộ nhớ tạm, không có message rõ ràng và dễ mất theo thời gian
  • [ ] D) Vì stash tốn nhiều disk space hơn commit

💡 Giải thích: Stash là temporary buffer, không phải version control. Stash entries thiếu context (message), dễ quên mục đích ban đầu, và có thể bị mất khi garbage collection. Commit mới là cách lưu trữ lâu dài đúng đắn.