Git Stash: Quản lý công việc đang làm mà không cần commit

Minh họa luồng git stash: working directory lưu vào refs/stash

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}.

Minh họa luồng git stash: working directory lưu vào refs/stash

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 -u hoặc --include-untracked — lưu cả untracked files (trừ ignored)
  • git stash -a hoặc --all — lưu tất cả kể cả ignored files
  • git 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.

Terminal git stash push -m và git stash list output

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 list kiể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 branch an 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.

Nguồn: Git Documentation – git-stash

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Alacritty vs Kitty vs WezTerm: Terminal hiện đại so sánh chi tiết

Terminal là nơi dành nhiều thời gian nhất của developer. Một terminal emulator nhanh, nhẹ, và có khả năng tùy biến cao sẽ nâng cao năng suất đáng kể. Ba…

Xem thêm

Git Hooks: Tự động hóa kiểm tra code trước khi commit

Git Hooks: Tự động hóa kiểm tra code trước khi commit VS Code IDE with pre-commit hooks configuration on split screen Git hooks là script tự chạy ở các sự…

Xem thêm

Hướng Dẫn Fish Shell: Terminal Lành Mạnh Thay Thế Bash Trên Linux

Fish Shell là gì? Fish (Friendly Interactive Shell) là một Unix shell miễn phí và mã nguồn mở, được thiết kế để thân thiện và dễ sử dụng hơn Bash….

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất