HocTotGit.io

Lệnh tiện ích (Utility Commands)
  • Cherry Pick
  • Stash
  • Tagging
Liên kết
Blog
Hỗ trợ

Email: work.lamsun@gmail.com

Yêu thích nền tảng

Hãy chia sẻ ý kiến của bạn

HocTotGit.io

© 2026 HocTotGit.

Stash

1. Tổng quan

Git stash lưu một bản nháp của các thay đổi đang thực hiện và hoàn nguyên các file trong working directory trở lại khớp với commit HEAD.

Stash thường được sử dụng để lưu một bản nháp của công việc đang thực hiện chưa sẵn sàng để commit. Stash cũng có thể được sử dụng để tạm thời đặt các file sang một bên trước khi thực hiện pull, merge hoặc rebase từ remote. Git lưu trữ các stash trong một cấu trúc giống như stack, và nhiều stash có thể được lưu trữ cùng một lúc.


2. Quy trình Stash cơ bản

2.1. Lưu một Stash

Stash cơ bản:

git stash

Theo mặc định, Git sẽ stash cả các thay đổi đã được staged và unstaged có trong working directory; tuy nhiên, nó không stash các file untracked.

Stash các file untracked:

Để stash các file untracked ngoài các thay đổi staged/unstaged, hãy truyền cờ -u:

git stash -u

Thêm message cho stash:

Đây là một thực hành tốt để để lại một ghi chú ngắn mô tả công việc đang thực hiện chứa trong stash. Cung cấp điều này với cờ -m:

git stash -m 'Mô tả các thay đổi đã stash'

Cờ -m cũng có thể được cung cấp khi stash các file untracked:

git stash -u -m 'Mô tả các thay đổi đã stash'

2.2. Áp dụng các thay đổi đã Stash

Để áp dụng lại bộ thay đổi đã stash gần nhất vào working directory của bạn, hãy sử dụng:

git stash pop

Sau khi pop, Git sẽ xóa stash khỏi stack.

Cảnh báo về merge conflicts:

Nếu các thay đổi được giới thiệu trước khi áp dụng stash của bạn xung đột với các file từ stash đó, bạn sẽ gặp merge conflict. Bạn có thể tránh khả năng xung đột bằng cách tạo một branch từ một stash entry thay vì áp dụng trực tiếp (sẽ được giải thích sau trong bài này).


3. Các lệnh Stash bổ sung

3.1. Xem các Stash hiện có

Để xem danh sách các stash hiện có, hãy chạy:

git stash list

Output:

stash@{0}: On main: hotfix in progress
stash@{1}: On auth: Started login widget
stash@{2}: On nav: WIP darkmode navbar

Output bao gồm branch đã được checkout khi stash được tạo, và mô tả về các thay đổi đã stash. Các stash entry mới được thêm vào đầu stack stash, nghĩa là stash entry mới nhất sẽ được liệt kê đầu tiên ở vị trí 0.

3.2. Áp dụng một Stash cụ thể

Để áp dụng một stash entry cụ thể, hãy chỉ định index của stash. Ví dụ, để áp dụng stash thứ ba trong danh sách ở trên, hãy sử dụng:

git stash pop stash@{2}

Hoặc bạn có thể sử dụng git stash apply để áp dụng stash mà không xóa nó khỏi stack:

git stash apply stash@{2}

Sự khác biệt giữa pop và apply:

  • git stash pop: Áp dụng stash và xóa nó khỏi stack
  • git stash apply: Áp dụng stash nhưng giữ nó trong stack

3.3. Xóa một Stash

Để xóa một stash, hãy thực thi:

git stash drop <stash-index-num>

Ví dụ, để xóa stash đầu tiên:

git stash drop stash@{0}

3.4. Xóa toàn bộ Stack

Để xóa tất cả các stash, hãy chạy:

git stash clear
Cảnh báo:

Lệnh git stash clear sẽ xóa vĩnh viễn tất cả các stash. Hãy đảm bảo bạn không cần bất kỳ stash nào trước khi chạy lệnh này.


4. Stash Conflicts

Xung đột merge có thể phát sinh nếu các thay đổi được lưu trữ trong stash entry xung đột với các file trong working directory, hoặc lịch sử commit của branch đã chọn. Trong những trường hợp này, có thể cần can thiệp thủ công.

Khi gặp xung đột khi áp dụng stash, bạn sẽ thấy thông báo tương tự như merge conflict. Quy trình giải quyết tương tự:

  1. Mở các file bị xung đột
  2. Chỉnh sửa để giải quyết xung đột
  3. Stage các file đã sửa
  4. Tiếp tục bằng git stash drop nếu bạn đã sử dụng pop, hoặc chỉ cần xóa stash thủ công nếu bạn đã sử dụng apply

Tạo branch từ stash:

Một cách để tránh xung đột là tạo một branch mới từ stash entry:

git stash branch <new-branch-name> stash@{0}

Lệnh này sẽ tạo một branch mới từ commit hiện tại, áp dụng stash, và sau đó xóa stash nếu áp dụng thành công.


5. Lưu ý

  • Stash chỉ lưu các thay đổi trong working directory và staging area. Các file untracked không được stash trừ khi bạn sử dụng cờ -u.

  • Stash được lưu trữ trong một stack, với stash mới nhất ở đầu (stash@).

  • Stash có thể hữu ích khi bạn cần chuyển branch nhanh chóng nhưng chưa muốn commit các thay đổi đang làm dở.

  • Hãy cẩn thận khi sử dụng git stash clear vì nó sẽ xóa vĩnh viễn tất cả các stash.

  • Nếu bạn quên message khi stash, bạn vẫn có thể xem danh sách stash để nhớ lại stash nào chứa gì.


Tổng kết

Stash cho phép bạn tạm thời lưu các thay đổi đang thực hiện và hoàn nguyên working directory về trạng thái sạch sẽ. Quy trình cơ bản bao gồm lưu stash với git stash và áp dụng lại với git stash pop. Bạn có thể quản lý nhiều stash, áp dụng stash cụ thể, và giải quyết xung đột nếu chúng phát sinh.

Stash là một công cụ tiện ích mạnh mẽ để quản lý công việc đang thực hiện, đặc biệt hữu ích khi bạn cần chuyển context nhanh chóng mà không muốn commit các thay đổi chưa hoàn thành.

Tiếp theo: Tagging