
Git Stash: Quản Lý Thay Đổi Tạm Thời Hiệu Quả Cho Developer
Git stash là lệnh lưu trữ tạm thời các thay đổi trong working directory khi bạn cần chuyển sang công việc khác mà chưa muốn commit dở. Đây là công cụ không thể thiếu để quản lý context switching trong phát triển phần mềm hàng ngày.


Trong quy trình phát triển, bạn thường rơi vào tình huống: đang code feature A thì nhận được bug hotfix B cần xử lý ngay. Nhưng feature A chưa hoàn thành, code chưa chạy được, không thể commit. Git stash giải quyết bằng cách “cất giữ” các thay đổi hiện tại, đưa working directory về trạng thái sạch (HEAD commit), để bạn tập trung vào bug fix.
Sau khi hoàn thành hotfix, bạn khôi phục stash và tiếp tục feature A — mọi thay đổi vẫn nguyên vẹn đúng chỗ.
Các Lệnh Cơ Bản
git stashhoặcgit stash push— lưu thay đổi hiện tại vào stash stackgit stash list— xem danh sách tất cả stashes đã lưugit stash show— xem chi tiết thay đổi trong một stashgit stash pop— khôi phục stash gần nhất và xóa khỏi danh sáchgit stash apply— khôi phục stash mà KHÔNG xóa khỏi danh sáchgit stash drop— xóa một stash cụ thểgit stash clear— xóa toàn bộ stashes
Quy Trình Làm Việc Ví Dụ
Tình huống: đang phát triển feature user-auth, nhận bug fix khẩn cấp.
# 1. Lưu thay đổi tạm thời
git stash push -m "feature user-auth: phần validation form"
# 2. Chuyển sang branch hotfix
git checkout hotfix/login-bug
# 3. Sửa bug, commit, push
# ... fix code ...
git commit -m "fix: resolve login redirect issue"
git push origin hotfix/login-bug
# 4. Quay lại feature, khôi phục stash
git checkout feature/user-auth
git stash pop
Các Tuỳ Chọn Quan Trọng
| Tuỳ chọn | Chức năng |
|---|---|
-u / --include-untracked |
Cả file untracked cũng được stash |
-a / --all |
Cả ignored files cũng được stash |
-m <message> |
Đặt tên mô tả cho stash, dễ nhận biết khi có nhiều stash |
--pathspec |
Chỉ stash thay đổi ở các file/paths cụ thể |
stash@{<ref>} |
Tham chiếu stash theo thời gian, ví dụ: stash@{2.hours.ago} |
Git Stash Trong Thực Tế
- Context switching: Chuyển nhanh giữa nhiều feature không liên quan
- Code review: Stash WIP, checkout branch review branch, pop lại sau
- Experiment: Test ý tưởng mới, stash nếu không khả thi, quay lại code cũ
- Pull với thay đổi dở: Stash → pull → stash pop để tránh conflict khi merge
Lưu Ý Và Best Practices
- Đặt tên stash: Dùng
-mđể mô tả nội dung. Stash không tên chỉ hiển thị “WIP on branch” — khó quản lý khi có 5+ stashes - Stash không dùng dài hạn: Stash là tạm thời, không thay thế commit. Nếu code ổn định, commit đi.
- Cẩn thận với merge conflict: Khi
git stash pop, nếu code đã thay đổi nhiều, có thể xảy ra conflict. Giải quyết thủ công hoặc dùnggit stash applyrồi resolve dần. - Dùng
git stash branch: Tạo branch mới từ stash — hữu ích khi muốn tiếp tục stash ở ngữ cảnh mới.
Git stash là một trong những lệnh được dùng nhiều nhất trong workflow hàng ngày của developer. Hiểu rõ cách dùng giúp tiết kiệm thời gian, tránh mất code, và quản lý context hiệu quả khi làm việc nhóm. Dưới đây là các pattern nâng cao mà developer chuyên nghiệp thường sử dụng.
Git Stash Trong Workflow Nhóm
Trong làm việc nhóm, context switching diễn ra liên tục. Một lập trình viên có thể đang code feature A, nhận pull request review cho feature B, và cần hotfix khẩn cấp cho production. Git stash giúp quản lý từng trạng thái mà không tạo commit dở.
Pattern 1: Stash trước khi pull
# Code dở, cần pull bản mới nhất
git stash
git pull origin main
git stash pop
Pattern này tránh conflict khi pull với code chưa commit. Nếu conflict xảy ra khi pop, giải quyết thủ công hoặc dùng git stash pop --index để giữ nguyên staged/unstaged phân chia.
Pattern 2: Stash tag và branch
# Tạo branch mới từ stash hiện tại
git stash branch experiment/bug-analysis stash@{0}
# Lúc này stash đã được áp dụng và xóa, bạn đang trên branch mới
Pattern này hữu ích khi muốn tiếp tục work-in-progress ở ngữ cảnh mới mà không cần commit.
Git Stash Và Code Review
Khi reviewer yêu cầu thay đổi, bạn thường cần stash WIP để checkout branch review:
git stash push -m "WIP: refactor auth module"— stash có tên mô tảgit fetch origin && git checkout origin/pr/42/head— checkout PR reviewgit checkout feature/auth && git stash pop— quay lại WIP
Xử Lý Conflict Khi Pop
Conflict khi git stash pop xảy ra khi code gốc đã thay đổi kể từ khi stash được tạo. Cách xử lý:
# 1. Thử pop
git stash pop
# Nếu conflict, git sẽ giữ lại stash, cho phép resolve thủ công
# 2. Sau khi resolve, đánh dấu đã giải quyết
git add .
git commit -m "resolved: stash changes"
# 3. Xóa stash đã áp dụng thành công
git stash drop
Quan trọng: nếu git stash pop gặp conflict, stash vẫn còn trong danh sách. Đừng xóa stash trước khi xác nhận code hoạt động.
Stash Cho Các Trường Hợp Đặc Biệt
- Stash staged changes:
git stash --staged— chỉ stash staged changes, giữ unstaged - Stash một file:
git stash push -m "fix config" -- config.yml— stash theo pathspec - Stash commit:
git stash createtạo stash commit object mà không đẩy vào reflog — hữu ích cho script - Export/Import stash:
git stash export --to-ref refs/stash/exported— Git 2.35+ hỗ trợ xuất stash giữa repo
Git stash là công cụ đơn giản nhưng mạnh mẽ. Kết hợp với git worktree (làm việc trên nhiều branch đồng thời), developer có thể quản lý context một cách hiệu quả mà không bao giờ cần viết code dở trong file không đúng.
