Git stash là gì? Lưu công việc tạm khi chuyển nhánh Git

Màn hình laptop hiển thị mã nguồn trong trình soạn thảo

Khi lập trình với Git, bạn đôi khi cần chuyển sang nhánh khác ngay giữa chừng nhưng chưa muốn commit công việc đang làm. git stash là giải pháp lưu thay đổi tạm thời, giúp working directory sạch sẽ để checkout nhanh mà không mất code.

Git stash hoạt động thế nào?

git stash lưu tất cả thay đổi trong working directory và staged area vào một danh sách ẩn gọi là stash stack. Sau khi stash, working directory trở về trạng thái lần commit cuối, giống như bạn chưa từng chỉnh sửa file nào. Bạn có thể lấy lại thay đổi bất kỳ lúc nào bằng git stash pop hoặc git stash apply.

Cách dùng git stash cơ bản

Lệnh cơ bản nhất để lưu công việc tạm:

git stash

Hoặc lưu kèm mô tả để sau này dễ nhận biết:

git stash save "WIP: tính năng đăng nhập OAuth"

Kiểm tra danh sách stash đang có:

git stash list

Kết quả hiển thị dạng stash@{0}: On main: WIP: tính năng đăng nhập OAuth.

Lấy lại thay đổi: pop vs apply

Hai lệnh để restore stash khác nhau ở chỗ giữ lại bản ghi stash hay không.

Lệnh Hành vi Dùng khi
git stash pop Apply stash và xóa khỏi stack Đã dùng xong, không cần stash nữa
git stash apply Apply stash nhưng giữ lại trong stack Cần dùng lại stash nhiều lần

Nếu bạn có nhiều stash, chỉ định stash cụ thể:

git stash pop stash@{1}

Sơ đồ luồng công việc Git từ khởi tạo đến đẩy lên kho lưu trữ

Stash có include files chưa track?

Mặc định git stash chỉ lưu file đã được theo dõi (tracked). File mới chưa git add sẽ không được stash. Để bao gồm cả file chưa track:

git stash -u

Hoặc bao gồm cả file bị .gitignore bỏ qua:

git stash -a

Xóa stash không cần thiết

Xóa stash cụ thể:

git stash drop stash@{0}

Xóa toàn bộ stash stack:

git stash clear

Sơ đồ các thao tác Git bao gồm checkout stash merge push

Khi nào nên dùng git stash?

  • Nhận pull request khẩn cấp, cần checkout sang nhánh hotfix
  • Thử nghiệm đoạn code mới rồi muốn quay lại trạng thái sạch để đánh giá
  • Chuyển sang nhánh feature khác mà chưa muốn commit công việc hiện tại

Đừng lạm dụng git stash thay cho commit nhỏ. Nếu thay đổi có giá trị, hãy commit lên nhánh riêng. git stash là công cụ tạm thời, không phải công cụ quản lý code dài hạn.

Git stash và branch: workflow thực tế

Quy trình điển hình khi bạn đang code feature A (nhánh feature-A) nhưng cần sửa bug khẩn cấp trên main:

  1. git stash save "WIP: feature A - half done"
  2. git checkout main
  3. git checkout -b hotfix/login-bug
  4. Sửa bug, commit: git commit -am "Fix login validation"
  5. git checkout main && git merge hotfix/login-bug
  6. git checkout feature-A
  7. git stash pop – tiếp tục code feature A

Workflow này giúp bạn không bao giờ mất code dở dang, đồng thời giữ lịch sử commit sạch.

Xử lý conflict khi stash pop

Nếu code trên nhánh hiện tại thay đổi cùng file với stash, git stash pop có thể báo conflict. Git sẽ đánh dấu conflict trong file (<<<<<<>>>>>>). Bạn giải quyết thủ công, rồi git add và commit. Hoặc dùng git stash apply để giữ stash, giải quyết conflict, rồi git stash drop khi xong.

Các tùy chọn nâng cao của git stash

Ngoài các lệnh cơ bản, git stash còn hỗ trợ:

  • git stash push -m "message": Tương đương git stash save nhưng cú pháp mới hơn.
  • git stash branch : Tạo nhánh mới từ stash và xóa stash – hữu ích khi stash quá cũ so với HEAD.
  • git stash show -p: Hiển thị diff đầy đủ của stash thay vì chỉ tóm tắt.
  • git stash show stash@{1} --stat: Xem thống kê thay đổi của stash cụ thể.

Lệnh git stash branch đặc biệt hữu ích khi bạn stash code rồi quên lâu ngày, base commit đã thay đổi nhiều. Nó tự động tạo nhánh mới tại commit gốc của stash, apply stash, và xóa stash – giúp bạn tiếp tục làm việc ngay mà không lo conflict.

Stash vs Commit: khi nào dùng cái nào?

Quy tắc đơn giản: nếu thay đổi hoàn thành một đơn vị logic (tính năng, sửa bug, refactor) → git commit. Nếu thay đổi chưa xong, mang tính thử nghiệm, hoặc cần chuyển nhánh gấp → git stash. Commit tạo lịch sử vĩnh viễn, stash tạo bộ nhớ tạm. Lạm dụng stash làm rối stash stack, lạm dụng commit tạo lịch sử rác – cân bằng là chìa khóa.

Kết luận

git stash giúp bạn di chuyển giữa các nhánh Git nhanh chóng mà không cần commit dở. Dùng git stash save kèm mô tả, git stash pop để lấy lại, và git stash drop để dọn stack định kỳ. Kết hợp với git commit thường xuyên để code luôn an toàn.

Xem thêm: Tài liệu chính thức git stashHướng dẫn Atlassian về 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

Zig Language: Tính Năng, So Sánh Với Rust/C++ Cho System Programming

Zig là ngôn ngữ lập trình hệ thống hiện đại, tối ưu hiệu năng, độ an toàn và khả năng đọc. Zig phát triển từ 2015 bởi Andrew Kelley, với…

Xem thêm

React 19: Compiler, Server Components, Actions – Tính năng mới

React 19 chính thức phát hành ổn định vào tháng 12/2024, mang đến những thay đổi kiến trúc lớn nhất kể từ/hooks. Phiên bản này tập trung vào Server Components,…

Xem thêm
Tauri vs Electron bundle size comparison showing Tauri 3-5MB vs Electron 50-60MB

Tauri: Framework Xây Dựng App Desktop Đa Nền Tảng Với Rust

Tauri là framework mã nguồn mở cho phép xây dựng ứng dụng desktop (Windows, macOS, Linux) bằng công nghệ web (HTML, CSS, JavaScript/TypeScript) nhưng sử dụng Rust làm backend thay…

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