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.
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'
Để á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.
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).
Để 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.
Để á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 stackgit stash apply: Áp dụng stash nhưng giữ nó trong stackĐể 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}
Để xóa tất cả các stash, hãy chạy:
git stash clear
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.
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ự:
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 applyTạ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.
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ì.
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