Git stash là gì? Cách sử dụng Git stash hiệu quả

Đối với các nhà phát triển phần mềm, việc kiểm soát phiên bản là một phần không thể thiếu trong quá trình làm việc.

Bài viết dưới đây sẽ giúp bạn hiểu rõ hơn về lệnh Git stash. Ngoài ra, chúng ta cũng sẽ tìm hiểu cách sử dụng Git stash một cách hiệu quả nhất.

Git stash là gì?

Khi bạn đang làm việc trên Git, đôi khi bạn gặp vấn đề xuất hiện trong công việc đang tiến hành và bạn phải tạm dừng công việc hiện tại để quay lại sửa lỗi gấp. Bạn nghĩ đến cách giải quyết vấn đề này như thế nào?

Bạn có thể tạo một nhánh mới để sửa lỗi. Tuy nhiên, khi dự án của bạn đang ở trạng thái chưa hoàn thành, Git cung cấp hai tùy chọn cơ bản:

  • Sử dụng git reset –hard để xóa các thay đổi đã commit.
  • Lưu lại công việc chưa hoàn tất và biến nó thành commit mới.

Tuy nhiên, nếu bạn chọn cách thứ nhất, tất cả công việc của bạn sẽ bị mất. Cách thứ hai có thể dẫn đến một commit không có ý nghĩa.

Trong tình huống như vậy, Git stash có thể giúp bạn quay lại công việc cũ để sửa lỗi và đồng thời lưu lại nhánh đang làm việc.

Đơn giản như là, Git stash là các thay đổi tạm thời trong quá trình code của bạn.

Tại sao Git stash quan trọng?

Điều quan trọng cần hiểu là tại sao việc lưu trữ các thay đổi trong Git là quan trọng. Giả sử rằng Git không có lệnh lưu trữ. Giả sử bạn đang làm việc trên hai nhánh A và B, hai nhánh này đã tách ra và có các commit khác nhau.

Khi bạn làm việc trên một số tệp trong nhánh A, nhóm của bạn yêu cầu bạn sửa một lỗi trong nhánh B. Bạn đã lưu các thay đổi của mình và thử kiểm tra nhánh B bằng git checkout B. Git sẽ ngay lập tức từ chối và thông báo lỗi “Những thay đổi của bạn đối với các tệp sau sẽ bị ghi đè… Vui lòng thực hiện hoặc lưu trữ các thay đổi của bạn trước khi chuyển đổi nhánh.”

Có một số cách để chuyển đổi nhánh trong tình huống này:

  • Tạo một commit tại thời điểm đó trong nhánh A, commit và đẩy thay đổi để sửa lỗi trong nhánh B, sau đó kiểm tra lại nhánh A và chạy git reset HEAD ^ để lấy lại các thay đổi.
  • Giữ các thay đổi trong các tệp không được Git theo dõi bằng cách thủ công.

Phương pháp thứ hai không tốt. Phương pháp thứ nhất, mặc dù phổ biến, không linh hoạt vì thay đổi chưa hoàn thành được coi là một trạm kiểm soát chứ không phải là một bản vá đang tiếp tục được thực hiện. Đây chính là tình huống mà Git stash được thiết kế để giải quyết.

Git stash lưu trữ các thay đổi chưa được commit, cho phép bạn tiến hành các thay đổi, chuyển đổi nhánh và thực hiện các hoạt động Git khác. Sau đó, bạn có thể áp dụng lại các thay đổi đã lưu trữ khi cần. Kho lưu trữ chỉ có phạm vi cục bộ và không được đẩy lên điều khiển từ xa bằng git push.

Cách sử dụng Git stash hiệu quả

Khi sử dụng Git stash, bạn cần tuân theo trình tự sau:

  • Lưu các thay đổi vào nhánh A
  • Chạy Git stash
  • Kiểm tra lại nhánh B
  • Sửa lỗi nhánh B
  • Commit và tùy chọn push lên điều khiển từ xa
  • Kiểm tra lại nhánh A
  • Chạy Git stash pop để lấy lại các thay đổi đã lưu trữ.

Git stash giúp lưu trữ các thay đổi chưa commit trong thư mục làm việc cục bộ. Chúng cho phép bạn truy cập các thay đổi khi cần thiết.

Git stash rất hữu ích khi bạn cần chuyển đổi giữa các ngữ cảnh khác nhau. Chúng luôn cho phép bạn lưu trữ những thay đổi mà bạn có thể cần ở bất kỳ thời điểm nào, một cách nhanh chóng. Đồng thời, thư mục làm việc hiện tại của bạn vẫn giữ nguyên các thay đổi.

Cách tạo kho lưu trữ

Dưới đây là cách sử dụng lệnh Git stash để tạo một kho lưu trữ đơn giản nhất:

$ git stash
Saved working directory and index state
WIP on master; d7435644 Feat: configure graphql endpoint

Theo mặc định, Git stash lưu trữ các thay đổi không can thiệp, bao gồm các tệp ở bất kỳ giai đoạn nào và không phân biệt giai đoạn. Nó cũng bỏ qua các tệp chưa được theo dõi và bị bỏ qua trước đó.

Thường thì bạn không cần lưu trữ các tệp chưa được theo dõi và bị bỏ qua đó. Tuy nhiên, đôi khi chúng có thể ảnh hưởng đến các hoạt động khác mà bạn muốn thực hiện trong kho lưu trữ của mình.

Vì vậy, bạn có thể sử dụng các phiên bản bổ sung của lệnh Git stash cho các tệp chưa được theo dõi và bị bỏ qua như sau:

  • git stash -u hoặc git stash –include-untracked để lưu trữ các tệp chưa được theo dõi.
  • git stash -a hoặc git stash –all để lưu trữ các tệp chưa được theo dõi và các tệp bị bỏ qua.

Để lưu trữ các tệp cụ thể, bạn có thể sử dụng lệnh git stash -p hoặc git stash –patch:

$ git stash -p
diff –git a/.gitignore b/.gitignore
index 32174593..8d81be6e 100644
— a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
# dependencies
node_modules/
/.pnp
+f,fmfm
.pnp.js
# testing
(1/1) Stash this hunk [y,n,q,a,d,e,?]?

Liệt kê các kho lưu trữ

Để liệt kê các kho lưu trữ của bạn, bạn có thể sử dụng lệnh Git stash list.

Các kho lưu trữ sẽ được lưu trên một ngăn xếp cuối vào trước (LIFO):

$ git stash list
stash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint

Các kho lưu trữ sẽ được đánh dấu WIP mặc định trên đầu nhánh và cam kết rằng kho lưu trữ được tạo từ đó. Tuy nhiên, chỉ với số lượng thông tin hạn chế, bạn sẽ không thể xem nội dung cụ thể của chúng một cách dễ dàng.

Để thêm mô tả vào kho lưu trữ, bạn có thể sử dụng lệnh Git stash save như sau:

$ git stash save “remove semi-colon from schema”
Saved working directory and index state
On master: remove semi-colon from schema
$ git stash list
stash@{0}: On master: remove semi-colon from schema
stash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint

Truy xuất các thay đổi đã lưu trữ

Để truy xuất các thay đổi đã lưu trữ, bạn có thể sử dụng các lệnh Git stash apply và Git stash pop.

Cả hai lệnh đều áp dụng lại các thay đổi đã lưu trữ trong kho lưu trữ mới nhất. Cả hai lệnh đều giải phóng kho lưu trữ và áp dụng lại các thay đổi vào nhánh đang hoạt động. Lệnh Git stash pop được ưu tiên nếu bạn chỉ cần áp dụng lại các thay đổi đã lưu trữ một lần.

Với lệnh này, bạn có thể chọn kho mà bạn muốn áp dụng hoặc sử dụng mã định danh chuyển mã làm đối số cuối cùng:

$ git stash pop stash@{1}
hoặc:
$ git stash apply stash@{1}

Dọn dẹp kho lưu trữ

Sau khi hoàn thành công việc, để loại bỏ các kho lưu trữ không cần thiết, bạn có thể sử dụng các lệnh sau:

  • git stash clear để xóa tất cả các kho lưu trữ.
  • git stash drop <stash_id> để xóa một kho lưu trữ cụ thể khỏi danh sách.

Kiểm tra sự khác biệt trong kho lưu trữ:

Để kiểm tra sự khác biệt trong kho lưu trữ, bạn có thể sử dụng lệnh: git stash show <stash_id>. Lệnh này cho phép bạn xem lại sự khác biệt của một kho lưu trữ.

$ git stash show stash@{1}
console/console-init/ui/.graphqlrc.yml | 4 +-
console/console-init/ui/generated-frontend.ts | 742 +++++++++-
console/console-init/ui/package.json | 2 +-

Để xem sự khác biệt chi tiết hơn, bạn có thể sử dụng cờ –patch hoặc -p:

$ git stash show stash@{0} –patch
diff –git a/console/console-init/ui/package.json b/console/console-init/ui/package.json
index 755912b97..5b5af1bd6 100644
— a/console/console-init/ui/package.json
+++ b/console/console-init/ui/package.json
@@ -1,5 +1,5 @@
{
– “name”: “my-usepatternfly”,
+ “name”: “my-usepatternfly-2”,
“version”: “0.1.0”,
“private”: true,
“proxy”: “http://localhost:4000”
diff –git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsx
index a4764d2f3..da72b7e2b 100644
— a/console/console-init/ui/src/AppNavHeader.tsx
+++ b/console/console-init/ui/src/AppNavHeader.tsx
@@ -9,8 +9,8 @@ import { css } from “@patternfly/react-styles”;
interface IAppNavHeaderProps extends PageHeaderProps {
– toolbar?: React.ReactNode;
– avatar?: React.ReactNode;
+ // toolbar?: React.ReactNode;
+ // avatar?: React.ReactNode;
}
export class AppNavHeader extends React.Component {
render()

Related Posts