Git Stash: Quản Lý Thay Đổi Tạm Thời Hiệu Quả Cho Developer

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.

Git stash workflow: Trạng thái working directory trước và sau khi stash

Git stash options: Các tùy chọn -u, -a, --staged trong lệnh stash

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 stash hoặc git stash push — lưu thay đổi hiện tại vào stash stack
  • git stash list — xem danh sách tất cả stashes đã lưu
  • git stash show — xem chi tiết thay đổi trong một stash
  • git stash pop — khôi phục stash gần nhất và xóa khỏi danh sách
  • git stash apply — khôi phục stash mà KHÔNG xóa khỏi danh sách
  • git 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ùng git stash apply rồ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 review
  • git 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 create tạ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.

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

RabbitMQ — Hướng Dẫn Message Queue Cho Hệ Thống Phân Tán

RabbitMQ — Hướng Dẫn Message Queue Cho Hệ Thống Phân Tán Trong hệ thống phân tán, các dịch vụ cần giao tiếp với nhau mà không chặt chẽ về thời…

Xem thêm

Zig Language: Ngôn Ngữ Lập Trình Hệ Thống Hiệu Suất Cao

Zig là ngôn ngữ lập trình hệ thống mới, tập trung vào sự đơn giản, an toàn bộ nhớ và hiệu suất cao. Được tạo bởi Andrew Kelley, Zig hướng…

Xem thêm

BeautifulSoup: Hướng Dẫn Web Scraping Với Python

BeautifulSoup là thư viện Python mạnh mẽ giúp phân tích cú pháp HTML và XML, cho phép lập trình viên trích xuất dữ liệu từ trang web một cách trực…

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