
git stash là lệnh thiết yếu trong Git — cho phép lưu tạm trạng thái working directory và index khi cần chuyển sang branch khác mà không cần commit dở dang. Đây là công cụ quản lý context switching nhanh nhất mà không ảnh hưởng đến lịch sử commit.
Cú pháp cơ bản
Lệnh stash cơ bản lưu mọi thay đổi và revert về HEAD:
git stash # Tương đương: git stash push
git stash list # Liệt kê các stash đã lưu
git stash show [-u|--include-untracked|--only-untracked] [stash]
git stash drop [stash] # Xóa stash
git stash pop [stash] # Áp dụng + xóa stash
git stash apply [stash] # Áp dụng nhưng giữ lại stash
git stash branch [branchname] [stash] # Tạo branch mới từ stash
git stash clear # Xóa toàn bộ stash
Stash mặc định được lưu tại refs/stash. Stash cũ tìm thấy trong reflog: stash@{0} là mới nhất, stash@{1} là trước đó. Cũng có thể dùng thời gian: stash@{2.hours.ago}.

Stash với Untracked Files
Theo mặc định, git stash KHÔNG lưu untracked files. Dùng cờ để bao gồm:
git stash -uhoặc--include-untracked— lưu cả untracked files (trừ ignored)git stash -ahoặc--all— lưu tất cả kể cả ignored filesgit stash --only-untracked— chỉ stash untracked, không động đến tracked
Ví dụ workflow:
# Đang làm feature A, cần chuyển sang bugfix
git stash -u # Lưu cả file mới (logs.txt)
git checkout hotfix # Chuyển branch sạch
# ... sửa bug ...
git checkout feature-a
git stash pop # Khôi phục lại working directory
Patch Mode: Stash Từng Phần
git stash --patch hoặc git stash -p tương tác — chọn từng hunk (đoạn diff) để stash. Hữu ích khi chỉ muốn lưu một phần thay đổi:
git stash -p
# Interactive prompt:
# Stage chunk [y,n,q,a,d,/,j,J,g,e,?]:
Cũng có thể stash staged code bằng git stash --staged (Git 2.35+) hoặc git stash -S tương đương.
Đặt Tên Stash
Stash có thể đặt message mô tả:
git stash push -m "WIP: implement auth middleware"
git stash list
# stash@{0}: On feature-api: WIP: implement auth middleware
Naming stash giúp tìm kiếm và quản lý nhiều stash dễ dàng.

Ví Dụ Thực Tế
Chuyển Context Giữa Feature
Khi đang code feature A, có bug hotfix cần fix gấp:
git stash -u
git checkout hotfix-404
# Fix bug, commit
git checkout feature-a
git stash pop
Kéo Code Từ Stash Vào Branch Khác
# Stash ở branch cũ
git stash push -m "refactor: split middleware"
# Kiểm tra stash
git stash show -p stash@{0} # Xem diff
git stash show -p stash@{0} -- file.go # Xem diff 1 file
# Áp dụng vào branch hiện tại
git stash pop # Hoặc apply để giữ stash
Tạo Branch Từ Stash
Khi stash cũ cần thử nghiệm trên branch riêng:
git stash branch experiment-branch stash@{2}
# Tạo branch, áp dụng stash, checkout vào branch đó
# Stash gốc KHÔNG bị xóa
Git Stash Import/Export (Git 2.39+)
Git 2.39+ thêm export/import stash — hữu ích khi cần chia sẻ stash giữa máy:
git stash export --print # In stash commit
git stash import < commit-hash # Nhập stash vào repo
Lưu Ý và Best Practices
- KHÔNG dùng stash lâu dài: Stash dễ bị quên, merge conflict khi pop. Nếu cần lưu dài hơn → tạo branch
- Đặt tên stash:
git stash push -m "description"thay vì stash không tên - Stash sạch trước khi merge:
git stash listkiểm tra trước khi pull/merge - Conflict resolution: Khi pop gặp conflict, stash KHÔNG tự xóa → fix conflict rồi
git stash drop - Dùng branch thay stash:
git stash branchan toàn hơn stash cho công việc lớn
So Sánh: Stash vs Branch
| Tính năng | git stash | git branch |
|---|---|---|
| Độ nhanh | Rất nhanh (1 lệnh) | Chậm hơn (tạo commit) |
| Có lịch sử commit | Không (chỉ diff) | Có đầy đủ |
| Phù hợp cho | Switch nhanh < 30 phút | Lưu dài hạn, chia sẻ |
| Khó phục hồi | Dễ mất nếu nhiều stash | Dễ tìm (branch name) |
| Merge conflict | Thường gặp khi pop | Ít gặp hơn |
Kết luận
git stash là công cụ context switching không thể thiếu. Quy tắc vàng: dùng stash cho việc chuyển nhanh, dùng branch cho công việc cần lưu trữ lâu dài. Kết hợp git stash -u để bao gồm untracked files, -p để stash từng phần, và -m để đặt tên mô tả.
Đối với developer Việt Nam, việc thành thạo git stash giúp tránh tình huống “code dở branch sai” rất phổ biến khi làm việc nhóm.
