Đôi khi bạn muốn chuyển đổi các nhánh, nhưng bạn đang thực hiện một phần chưa hoàn thành trong dự án hiện tại của mình. Bạn không muốn thực hiện commit hoàn thành một nửa công việc. Git stashing cho phép bạn làm như vậy. Lệnh git stash cho phép bạn chuyển đổi các nhánh mà không cần commit nhánh hiện tại.
Stash giống như "Tạm nhập, tái xuất"
Hình dưới đây minh họa các thuộc tính và vai trò của lưu trữ liên quan đến kho lưu trữ và thư mục làm việc.
Nói chung, ý nghĩa của kho lưu trữ là ” cất giữ thứ gì đó một cách an toàn ở một nơi ẩn .” Ý nghĩa trong Git cũng giống như vậy đối với stash, Git tạm thời lưu dữ liệu của bạn một cách an toàn mà không cần commit.
Bạn đang code thì Leader thông báo "code của cậu ở PR trước đang có bug ở production, quay lại hot fix ngay và luôn nhé!". Sau khi nhận gáo nước lạnh từ Leader, bạn đang ở ngay bận với task mới và có khá nhiều files changed. Bạn buộc phải ngắt luồng công việc để tìm hướng giải quyết. Để bắt đầu giải quyết vấn đề, bạn cần một branch mới với code trên production.
Khi nói đến lệnh Git cơ bản, bạn có hai lựa chọn:
- Chạy
git reset --hard
để loại bỏ những thay đổi đã được commit của bạn. - Ghi lại công việc chưa hoàn tất của bạn như là một commit mới.
Tùy chọn đầu tiên làm mất tất cả công việc của bạn, trong khi cái sau dẫn đến một phần commit không có ý nghĩa. Không có tình huống là được mong đợi cả.
Đây là lúc lệnh git stash
phát huy tác dụng của nó. Hãy tưởng tượng nó giống như git reset --hard
, nó cung cấp cho bạn một branch sạch sẽ, nhưng nó cũng ghi lại các thay đổi không đầy đủ bên trong. Sau khi khắc phục xong lỗi nghiêm trọng, bạn có thể tái áp dụng những thay đổi này và bắt đầu lại từ nơi bạn đang dở dang. Bạn có thể xem git stash
như một nút "tạm dừng" cho tiến trình công việc của bạn.
Nếu bạn đã từng "voọc" hoặc làm việc thực tế với github thì kiểu gì bạn vài lần git stash và git stash pop. Nó là một tính năng rất hữu ích của git.
Stashing sẽ loại bỏ trạng thái lộn xộn của thư mục làm việc của bạn và tạm thời lưu nó để sử dụng lại sau. Nhiều tùy chọn có sẵn với git stash. Một số tùy chọn hữu ích được đưa ra dưới đây:
- Git stash save
- Git stash list
- Git stash apply
- Git stash pop
- Git stash show
- Git stash branch <name>
- Git stash clear
- Git stash drop
Bắt đầu đi vào từng dòng lệnh:
-
Git stash save (lưu với tin nhắn)
- Đơn giản lệnh này cũng giống như khi bạn gõ git stash vậy. Khác biệt duy nhất là lệnh này có những option khác nhau. Thí dụ:
-
Git stash cùng mới một message kèm theo
git stash save "Lưu tạm vì sếp đang giục một task khác"
-
Git stash loại bỏ những files không được theo dõi
git stash save -u or git stash save --include-untracked
-
- Đơn giản lệnh này cũng giống như khi bạn gõ git stash vậy. Khác biệt duy nhất là lệnh này có những option khác nhau. Thí dụ:
-
Git stash list (kiểm tra các kho lưu trữ)
- Trước khi thử lệnh này tôi sẽ thì thầm cho bạn chút về git stash - cả git stash hay git stash save thì chúng nó có cùng một cơ chế, thực ra Git sẽ tạo ra một commit khi bạn sử dụng 1 trong 2 lệnh trên và nó được lưu trữ lại trong repo của bạn. Bạn có thể xem danh sách stash của bạn bất cứ lúc nào khi bạn dùng lệnh:
Trong trường hợp trên, tôi đã tạo một kho lưu trữ, được hiển thị dưới dạng:git stash list
stash@{0}: WIP on master: 4e22905 abc 1865891265912 stash@{1}: On master: Lưu tạm vì sếp đang giục một task khác (END)
Nhấn q để thoát danh sách các stash.
Nếu chúng ta có nhiều hơn một kho, thì Nó sẽ hiển thị tất cả các kho tương ứng với id kho khác nhau. Hãy xem xét đầu ra dưới đây:
Nó sẽ hiển thị tất cả các kho có lập chỉ mục là stash @ {0}: stash @ {1}:, v.v.
- Trước khi thử lệnh này tôi sẽ thì thầm cho bạn chút về git stash - cả git stash hay git stash save thì chúng nó có cùng một cơ chế, thực ra Git sẽ tạo ra một commit khi bạn sử dụng 1 trong 2 lệnh trên và nó được lưu trữ lại trong repo của bạn. Bạn có thể xem danh sách stash của bạn bất cứ lúc nào khi bạn dùng lệnh:
-
Git stash apply
- Lệnh này cơ bản là sẽ lấy stash cuối cùng (gần nhất) để apply nó vào code của bạn, theo danh sách hàng đợi LIFO (vào cuối ra đầu).
Cú pháp:
git stash apply
Đầu ra:
Kết quả ở trên sẽ khôi phục kho cuối cùng. Bây giờ, nếu bạn kiểm tra trạng thái của kho lưu trữ, nó sẽ hiển thị những thay đổi trên file. Hãy xem xét đầu ra dưới đây :
Từ đầu ra ở trên, bạn có thể thấy rằng kho lưu trữ được khôi phục về trạng thái trước đó trước khi lưu trữ. Nó đang hiển thị đầu ra là “Các thay đổi chưa commit .”
- Nếu mà bạn muốn apply một kho bất kỳ, đơn giản chỉ cần lấy id của stash đó:
git stash apply stash@{1}
- Lệnh này cơ bản là sẽ lấy stash cuối cùng (gần nhất) để apply nó vào code của bạn, theo danh sách hàng đợi LIFO (vào cuối ra đầu).
-
Git stash pop
Git cho phép người dùng áp dụng lại các commit trước đó bằng cách sử dụng lệnh git stash pop. Tùy chọn popping xoá các thay đổi khỏi kho lưu trữ và áp dụng chúng vào file làm việc của bạn.Lệnh git stash pop khá giống với git stash apply. Sự khác biệt chính giữa cả hai lệnh này là lệnh stash pop xóa kho lưu trữ khỏi ngăn xếp sau khi nó được áp dụng.
Cú pháp:
git stash pop
Lệnh trên sẽ áp dụng lại các commit trước đó cho kho lưu trữ. Hãy xem xét đầu ra bên dưới.
Đầu ra:
-
Git stash show
Chúng ta có thể theo dõi các kho và thay đổi chúng. Để xem các thay đổi trong file trước khi lưu trữ và sau hoạt động lưu trữ, hãy chạy lệnh dưới đây:
Cú pháp:git stash show
-
Chúng ta có thể theo dõi chính xác những thay đổi nào được thực hiện trên file. Để hiển thị nội dung đã thay đổi của file, hãy thực hiện lệnh dưới đây:
Cú pháp:
git stash show -p
Ở đây, -p là viết tắt của một phần kho(the partial stash). Lệnh đã cho sẽ hiển thị các file và nội dung đã chỉnh sửa.
- Kết quả trên hiển thị tên file có nội dung đã thay đổi. Nó hoạt động giống như lệnh git diff. Lệnh git diff cũng sẽ hiển thị chính xác như vậy.
-
-
Git stash branch <name>
- Tạo một branch mới với nhưng thay đổi tương ứng trong stash gần nhất của bạn và cũng xoá nó khỏi stash list như git stash pop.
git stash branch branch-draff
- Bạn muốn tạo với một stash cụ thể thì thêm id vào sau tên branch mới (<name>)
git stash branch branch-draff stash@{1}
- Nó cực kỳ hữu ích khí code stash của bạn conflict với code mới nhất bạn kéo về trên nhánh đang làm việc.
- Tạo một branch mới với nhưng thay đổi tương ứng trong stash gần nhất của bạn và cũng xoá nó khỏi stash list như git stash pop.
-
Git stash clear
- Xoá toàn bộ stash bạn đang lưu trữ trong repo. Lưu ý là kho có thể sẽ không revert lại được.
git stash clear
- Xoá toàn bộ stash bạn đang lưu trữ trong repo. Lưu ý là kho có thể sẽ không revert lại được.
-
Git stash drop
- Xoá đi stash gần nhất, lLưu ý là kho có thể sẽ không revert lại được.
git stash drop
- Xoá stash cũ thể bằng chỉ định id, và không thể không revert cho bất cứ hành động sai lầm nào.
git stash drop stash@{1}
- Xoá đi stash gần nhất, lLưu ý là kho có thể sẽ không revert lại được.