Stashing cho phép bạn lưu mã của mình để sử dụng sau này trong kho lưu trữ Git.
Khi bạn đang làm việc với kho lưu trữ Git, bạn có thể thực hiện các thay đổi đối với tệp mà bạn muốn áp dụng cho cam kết Git sau này.
Đó là lúc lệnh git stash trở nên hữu ích. Stashing cho phép bạn lưu mã trên chi nhánh làm việc của mình cho một ngày sau đó. Trong hướng dẫn này, chúng ta sẽ thảo luận, với các ví dụ, khái niệm cơ bản về lưu trữ trong Git và cách sử dụng lệnh git stash.
Git Stash là gì?
Stashing cho phép bạn lưu mã trong thư mục làm việc của mình và lập chỉ mục cho sau này. Đôi khi, khi bạn đang viết mã, bạn sẽ muốn lưu những thay đổi bạn đã thực hiện, nhưng không chuyển chúng vào kho lưu trữ.
Một tình huống mà điều này có thể xảy ra là khắc phục sự cố. Giả sử có một báo cáo lỗi. Bạn đang làm việc để triển khai một tính năng. Bạn có thể muốn lưu những thay đổi bạn đã thực hiện trước tiên đối với tính năng và sau đó sửa lỗi.
Điều này là do báo cáo lỗi có thể sẽ được ưu tiên hơn tính năng bạn đang phát triển. Trước tiên, bạn muốn sửa lỗi trước khi chuyển mã tập trung vào tính năng vào kho lưu trữ. Bạn sẽ không muốn bản sửa lỗi và tính năng của mình xuất hiện trong bản cam kết. Điều này là do các cam kết lớn hơn và phức tạp hơn khiến các nhà phát triển khác khó đọc lịch sử của một kho lưu trữ hơn.
Nói cách khác, lưu trữ cho phép bạn làm việc trên thứ gì đó khác trong kho lưu trữ Git mà không cần phải hủy hoặc cam kết mã hiện có của bạn.
Lưu trữ cho phép bạn lưu hoặc “lưu trữ” những thay đổi bạn đã thực hiện đối với tệp để sử dụng sau này. Sau khi tệp đã được lưu trữ, bạn có thể làm việc trên một cái gì đó khác. Sau đó, bạn có thể quay lại sau và áp dụng các thay đổi bạn đã lưu trữ cho mã của mình.
81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.
Sinh viên tốt nghiệp bootcamp trung bình đã dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.
Stashing sẽ hoàn nguyên thư mục làm việc hiện tại về lần cam kết cuối cùng. Điều này có nghĩa là lưu trữ mã của chúng tôi cung cấp cho chúng tôi một thư mục làm việc sạch sẽ mà chúng tôi có thể làm việc. Có một thư mục sạch có nghĩa là chúng tôi có thể thực hiện các thay đổi mà không phải lo lắng về các xung đột hợp nhất. Chúng tôi cũng không phải suy nghĩ về việc sắp xếp các thay đổi mà chúng tôi thực hiện giữa các cam kết.
Cách lưu trữ các thay đổi trong Git
Lệnh git stash được sử dụng để lưu trữ mã sau này. Khi bạn chạy git stash, những thay đổi bạn chưa chuyển sang cam kết trong thư mục làm việc hiện tại của bạn sẽ được lưu lại để sử dụng sau. Điều này bao gồm cả các thay đổi theo giai đoạn (các thay đổi được thêm vào khu vực giai đoạn bằng cách sử dụng git add) và các thay đổi không theo giai đoạn.
Đây là cú pháp cho lệnh git stash:
git stash
Giả sử chúng tôi đang làm việc trên một trang web và mã của chúng tôi được lưu trữ trong kho lưu trữ Git.
Chúng tôi đã thực hiện các thay đổi đối với các tệp index.html và index.js trong mã của chúng tôi. Chúng tôi muốn lưu trữ các tệp này sau này trong khi sửa lỗi thiết kế trong tệp index.html của chúng tôi.
Để xem các thay đổi của chúng tôi, chúng tôi có thể sử dụng lệnh git status. Điều này trả về, trong ví dụ của chúng tôi:
Trên chi nhánh chính Chi nhánh của bạn được cập nhật với 'origin / master'.Các thay đổi được cam kết:tệp mới:index.jsĐiều này cho chúng tôi thấy rằng chúng tôi đã tạo một tệp mới (index.js) và chúng tôi đã sửa đổi tệp hiện có (index.html). Chúng tôi muốn lưu những thay đổi này để sử dụng sau trong khi chúng tôi làm việc trên một phần khác của cơ sở mã của chúng tôi. Để làm như vậy, chúng ta sẽ sử dụng lệnh git stash:
git stashMã của chúng tôi trả về:
Đã lưu thư mục làm việc và trạng thái chỉ mục WIP trên chính:3b16026 feat:Khởi chạy trang chủ mớiLệnh git stash đã lưu các thay đổi mà chúng tôi đã thực hiện vào kho lưu trữ của mình để sử dụng sau này. Bây giờ, nếu chúng ta chạy lại lệnh git status, chúng ta có thể thấy rằng không có gì để cam kết:
Trên nhánh chính Chi nhánh của bạn được cập nhật 'origin / master'. không có gì để cam kết, cây làm việc sạch sẽLệnh git stash đã lưu các thay đổi mà chúng tôi đã thực hiện vào kho lưu trữ của mình để sử dụng sau này. Bây giờ, nếu chúng ta chạy lại lệnh git status, chúng ta có thể thấy rằng không có gì để cam kết:
Khi mã của bạn được lưu trữ, kho lưu trữ của bạn sẽ được hoàn nguyên về cam kết trước đó mà không có những thay đổi bạn đã thực hiện. Những thay đổi bạn đã thực hiện đối với mã của mình đã được lưu lại để sử dụng sau này. Chúng có thể được áp dụng cho codebase của bạn khi bạn đã sẵn sàng bằng cách sử dụng lệnh stash pop.
Lưu trữ các thay đổi chưa được theo dõi
Lệnh git stash sẽ chỉ lưu trữ các thay đổi theo giai đoạn và không theo giai đoạn đối với các tệp đã được theo dõi trong kho lưu trữ Git . Theo mặc định, lệnh stash không bao gồm các thay đổi chưa được theo dõi.
Thay đổi giai đoạn là những thay đổi đã được thêm vào khu vực giai đoạn. Những thay đổi chưa phân giai đoạn được lưu trữ là những thay đổi được thực hiện đối với các tệp được Git theo dõi. Nếu bạn thay đổi tệp mới không được Git theo dõi, tệp đó sẽ không được thêm vào kho lưu trữ Git. Các tệp đã bị bỏ qua sẽ không được thêm vào kho lưu trữ.
Đây là các tùy chọn mặc định được áp dụng khi sử dụng lệnh git stash. Nếu bạn muốn lưu trữ các tệp chưa được theo dõi của mình - chẳng hạn như tệp mới chưa được theo giai đoạn - bạn có thể sử dụng cờ -u. Đây là cú pháp cho cờ -u:
git stash -uNgoài ra, nếu bạn muốn bao gồm các tệp bị bỏ qua trong kho lưu trữ của mình, bạn có thể sử dụng cờ -a. Đây là cú pháp cho cờ -a:
git stash -aSử dụng cờ -a sẽ yêu cầu git stash lưu trữ các thay đổi đối với các tệp bị bỏ qua của bạn. Đây là các tệp được xác định trong tệp .gitignore trong kho lưu trữ mã của bạn (nếu bạn có).
Áp dụng các thay đổi đã lưu trữ bằng git stash pop
Lệnh git stash pop được sử dụng để áp dụng các thay đổi đã lưu trong kho lưu trữ. Giả sử chúng ta đã quyết định rằng chúng ta muốn áp dụng các thay đổi đã lưu trữ mà chúng ta đã thực hiện trong ví dụ trước. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git stash popLệnh git stash pop trả về:
Trên chi nhánh chính Chi nhánh của bạn được cập nhật với 'origin / master'.Các thay đổi cần được cam kết:tệp mới:index.js Các thay đổi không được tổ chức cho cam kết:đã sửa đổi:index.html Đã thay đổi refs / stash @ {0} (48afd55381cf43f2332f771349c7233fb99f80a6)Khi chạy lệnh git stash pop, các thay đổi từ kho lưu trữ của chúng tôi sẽ được áp dụng cho bản sao làm việc cục bộ của kho lưu trữ của chúng tôi. Lệnh pop áp dụng mã trong tash cho kho lưu trữ của bạn. Sau đó, kho lưu trữ được làm trống.
Lệnh git stash pop cũng trả về danh sách các thay đổi bạn đã thực hiện đối với mã của mình, hiển thị những gì có trong kho lưu trữ của bạn.
Bạn có thể sử dụng lệnh git stash apply để áp dụng các thay đổi bạn đã thực hiện cho mã của mình. Bạn có thể giữ những thay đổi đó trong kho của mình. Chúng tôi có thể giữ các thay đổi trong kho lưu trữ này bằng cách sử dụng lệnh sau:
git stash áp dụngLệnh trả về:
Trên chi nhánh chính Chi nhánh của bạn được cập nhật với 'origin / master'.Các thay đổi được cam kết:tệp mới:index.jsÁp dụng các thay đổi trên nhiều chi nhánh
Việc áp dụng các thay đổi được lưu trữ giống nhau cho nhiều nhánh trên cơ sở mã của bạn là một trường hợp sử dụng tốt cho lệnh stash. Ví dụ:bạn có thể quyết định áp dụng kho lưu trữ cho một chi nhánh. Sau đó, bạn sẽ chuyển sang một chi nhánh khác và sử dụng cùng một kho để áp dụng các thay đổi đã lưu.
Nhiều chuỗi
Bạn có thể tạo nhiều kho lưu trữ trong Git. Điều này có nghĩa là có thể thực hiện các thay đổi đối với một tệp và lưu trữ chúng để sử dụng sau này. Bạn có thể thực hiện các thay đổi đối với tệp khác và lưu trữ chúng trong một kho lưu trữ riêng.
Số lần theo dõi
Để trả về danh sách các kho lưu trữ trong kho, bạn có thể chạy lệnh sau:
danh sách git stashGiả sử chúng ta muốn truy xuất danh sách tất cả các kho chúng ta đã tạo. Chúng tôi có thể làm như vậy bằng cách thực hiện lệnh trên. Lệnh này trả về:
stash @ {0}:WIP on master:3b16026 feat:Ra mắt homepagestash mới @ {1}:WIP on master:3b16026 feat:Ra mắt trang chủ mớiLệnh git stash list trả về danh sách các kho của chúng tôi.
Tuy nhiên, các kho lưu trữ này chỉ sử dụng các thông báo cam kết mặc định được liên kết với kho lưu trữ. Điều này có nghĩa là chúng tôi khó theo dõi kho nào bao gồm những thay đổi nào. Điều này là do chúng tôi chưa chỉ định mô tả về bất kỳ kho lưu trữ nào của chúng tôi.
Giả sử chúng tôi muốn thêm mô tả vào kho lưu trữ mới. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git stash save "thêm thay đổi mới cho trang web"Lệnh trả về:
Trạng thái chỉ mục và thư mục làm việc đã lưu Trên tổng thể:thêm thay đổi mới vào trang webThay vì được cung cấp thông báo mặc định được liên kết với lần cam kết cuối cùng của chúng tôi, kho lưu trữ của chúng tôi đã được chỉ định thông điệp riêng của nó.
Áp dụng nhiều chuỗi
Lệnh git stash pop áp dụng kho lưu trữ gần đây nhất cho kho lưu trữ của bạn (kho lưu trữ có thẻ stash @ {0}). Tuy nhiên, khi bạn đang làm việc với nhiều kho, bạn có thể muốn áp dụng một kho cụ thể cho cơ sở mã của mình.
Bạn có thể làm như vậy bằng cách chỉ định ID duy nhất được liên kết với kho lưu trữ mà bạn muốn áp dụng cho cơ sở mã của mình. Giả sử chúng ta muốn áp dụng kho lưu trữ tại stash @ {1} cho cơ sở mã của mình. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git stash pop stash @ {2}Lệnh áp dụng các thay đổi được lưu trữ trong stash @ {2} vào kho lưu trữ của chúng tôi và xóa kho lưu trữ.
Tạo Chi nhánh bằng Stash
Lưu trữ là một cách để lưu trữ thuận tiện những thay đổi bạn đã thực hiện đối với cơ sở mã trong khi bạn thực hiện một thay đổi khác.
Tuy nhiên, có thể đôi khi, thay vì duy trì một kho, bạn muốn chuyển mã của mình vào nhánh của chính nó.
Tình huống này có thể phát sinh nếu có xung đột phát sinh khi bạn hợp nhất mã của mình. Bạn cũng có thể muốn chuyển mã sang một nhánh khác nếu bạn đang thực hiện các thay đổi lớn hơn đối với cơ sở mã. Đó là nơi xuất hiện lệnh nhánh git stash.
Bạn có thể sử dụng lệnh git stash branch để tạo một nhánh mới mà các thay đổi trong kho sẽ được áp dụng. Cú pháp của lệnh này như sau:
git stash branchTham số "nhánh mới" đề cập đến ID của nhánh sẽ được tạo. “Stash-id” đề cập đến ID của kho chứa mã mà bạn muốn áp dụng cho chi nhánh mới.
Giả sử chúng tôi muốn áp dụng các thay đổi từ stash @ {2} của chúng tôi cho một nhánh mới có tên là “update-site”. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git stash branch update-site stash @ {2}Lệnh trả về:
Đã chuyển sang nhánh mới 'update-site'Trên nhánh update-site Các thay đổi cần được cam kết:tệp mới:index.js Các thay đổi không được tổ chức cho cam kết:đã sửa đổi:index.htmlDropped stash @ {2} (9a15b9cd20f8988937134d1267fafbea4c6a8647)Đầu tiên, lệnh git stash branch tạo một nhánh mới cho các thay đổi đã lưu trữ của chúng ta. Những thay đổi mà chúng tôi đã thực hiện đối với kho lưu trữ của mình được áp dụng cho chi nhánh mới. Sau đó, chúng tôi được chuyển sang xem chi nhánh đó. Cuối cùng, kho lưu trữ của chúng tôi bị xóa vì mã lưu trữ đã được lưu trong nhánh của chính nó.
Xóa Git Stash
Khi bạn đã sử dụng mã trong kho lưu trữ, bạn có thể sử dụng lệnh git stash drop để xóa kho lưu trữ. Đây là cú pháp cho lệnh git stash drop:
git stash dropGiả sử chúng ta muốn giảm kho bằng ID stash @ {2}. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git stash drop stash @ {2}Lệnh trả về:
Đã thả stash @ {2} (82079798c950b053fac0efb7b1d5693864dc96e7)Ngoài ra, bạn có thể sử dụng lệnh git stash clear để xóa tất cả các kho lưu trữ được liên kết với một kho lưu trữ. Cú pháp của lệnh này là:
git stash clearLệnh này sẽ xóa tất cả các kho lưu trữ trong kho lưu trữ của chúng tôi.
Lưu trữ các tệp cụ thể
Lệnh git stash lưu trữ tất cả các tệp được theo dõi trong thư mục làm việc hiện tại của bạn theo mặc định. Tuy nhiên, trong một số trường hợp, bạn có thể quyết định rằng bạn muốn lưu trữ một tệp hoặc tập hợp tệp cụ thể.
Bạn có thể lưu trữ một tệp cụ thể bằng lệnh git stash push. Đây là cú pháp để sử dụng lệnh này:
git stash push -m "" Tham số "message" đề cập đến thông báo sẽ được liên kết với kho lưu trữ của bạn. Tham số "tệp" là tên của tệp bạn muốn lưu trữ.
Giả sử chúng ta chỉ muốn thêm những thay đổi mà chúng ta đã thực hiện đối với tệp index.html trong mã của chúng ta vào một kho lưu trữ. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git stash push -m "feat:change index.html file" index.htmlLệnh trả về:
Đã lưu thư mục làm việc và trạng thái chỉ mục Trên tổng thể:feat:thay đổi tệp index.htmlLệnh chỉ thêm tệp index.html vào một kho lưu trữ với thông báo cam kết “tệp feat:đã thay đổi tệp index.html”. Tất cả các thay đổi khác mà chúng tôi đã thực hiện đối với mã của mình chưa được thêm vào.
Hiển thị sự khác biệt giữa các dấu gạch ngang
Khi bạn đang làm việc với các kho lưu trữ, bạn có thể sẽ thực hiện một số thay đổi khác nhau đối với cơ sở mã của mình qua nhiều lần cam kết trước khi bạn quay lại mã mà bạn đã lưu trữ.
Ví dụ:nếu bạn đã lưu trữ mã của mình và tiếp tục sửa lỗi, bạn có thể thực hiện một vài cam kết để sửa lỗi trước khi quay lại mã đã lưu trữ của mình. Điều này có nghĩa là bạn có thể muốn xem bản tóm tắt về sự khác biệt giữa lưu trữ của bạn và cam kết gần đây nhất của mã của bạn (để bạn biết những thay đổi bạn đã thực hiện kể từ khi lưu trữ mã của mình).
Để xem sự khác biệt giữa kho lưu trữ và cam kết gần đây nhất của bạn, bạn có thể sử dụng lệnh git stash show. Cú pháp của lệnh này là:
git stash showTham số “stash-id” là ID của kho chứa những thay đổi mà bạn muốn so sánh với cam kết gần đây nhất của chi nhánh của bạn. Giả sử chúng ta muốn so sánh mã trong kho lưu trữ stash @ {1} với trạng thái hiện tại của mã của chúng ta. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git stash show stash @ {1}Lệnh trả về:
index.html | 2 + - index.js | 0 2 tệp đã thay đổi, 1 lần chèn (+), 1 lần xóa (-)Đầu ra này cho chúng ta biết rằng chúng ta đã thực hiện hai thay đổi đối với mã của mình:một lần chèn và một lần xóa. Nếu chúng ta muốn xem sự khác biệt giữa các tệp của mình, chúng ta có thể thấy chúng bằng cách sử dụng cờ -p stash. Cú pháp cho cờ này như sau:
git stash show -p stash @ {1}Lệnh trên, khi được thực thi, trả về:
diff --git a / index.html b / index.htmlindex 4dd1ef7..e859c68 100644 --- a / index.html +++ b / index.html @@ -1 +1 @@ - +