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, kiểm soát phiên bản là một phần tất yếu trong công việc.

Bài viết dưới đây sẽ giúp các bạn hiểu hơn về lệnh Git stash. Bên cạnh đó, bạn có thể khám phá những cách sử dụng git stash sao cho hiệu quả nhất có thể.

Git stash là gì?

Khi thực hiện code trên Git, đột nhiên xuất hiện một vấn đề ở phần workload cũ khiến bạn phải tạm dừng công việc hiện tại để quay lại sửa gấp? Việc đầu tiên bạn nghĩ đến để giải quyết vấn đề này là gì?

Git stash là gì? Cách sử dụng Git stash hiệu quả
Git stash là gì? Hướng dẫn cách sử dụng Git stash hiệu quả nhất

Bạn có thể tạo một branch mới để bắt tay vào việc sửa lại. Với dự án còn đang dở dang của mình, các lệnh git cơ bản sẽ có thể đặt ra cho bạn 2 lựa chọn:

  • Sử dụng git reset– hard để xóa những thay đổi đã được 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 chọn cách 1, nó sẽ làm mất tất cả công việc của nó. Cách 2 sẽ có thể dẫn đến một phần commit không có ý nghĩa. 

Trong tình huống này, Git stash có thể phát huy một cách hiệu quả những công dụng của nó. Chúng vừa có thể giúp bạn quay trở lại workload cũ để sửa chữa, vừa có thể giúp bạn lưu lại branch đang làm.

Có thể hiểu một cách đơn giản, Git stash chính là các nút tạm dừng trong quá trình code của bạn đang diễn ra.

Tại sao git stash lại quan trọng?

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

Trong khi 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 nhanh chóng lưu các thay đổi của mình vào A và thử kiểm tra nhánh B bằng git checkout B. Git ngay lập tức hủy thao tác và ném lỗi, “Các thay đổi cục bộ của bạn đối với các tệp sau đây sẽ bị thanh toán ghi đè… Vui lòng thực hiện các thay đổi của bạn hoặc lưu trữ chúng trước khi bạn chuyển đổi chi nhánh.

Tại sao git stash lại quan trọng?
Tại sao git stash lại quan trọng?

Có một số cách để bật chuyển đổi nhánh trong trường hợp này:

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

Phương pháp thứ hai là một ý tưởng tồi. Phương pháp đầu tiên, mặc dù có vẻ thông thường, kém linh hoạt hơn vì các thay đổi đã lưu chưa hoàn thành được coi như một trạm kiểm soát chứ không phải là một bản vá vẫn đang được tiến hành. Đây chính xác là loại kịch bản git stash được thiết kế cho.

Git stash lưu cục bộ các thay đổi chưa được cam kết, cho phép bạn thực hiện các thay đổi, chuyển đổi các 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. Một kho lưu trữ được xác định phạm vi cục bộ và không được đẩy đến điều khiển từ xa bằng git push.

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

Trong khi sử dụng Git stash, bạn cần phải tuân theo trình tự sau đây:

  • 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
  • Cam kết và tùy chọn đẩy đế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 đã được lưu trữ của bạn.
Cách sử dụng Git stash hiệu quả
Cách sử dụng Git stash hiệu quả

Git stash giúp bạn lưu trữ các thay đổi đã thực hiện đối với thư mục làm việc cục bộ. Chính xác là chúng sẽ cho phép bạn truy xuất các thay đổi khi cần.

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

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

Dưới đây là cách thao tác lệnh Git stash để tạo kho lưu trữ một cách đơ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 được can thiệp kể cả các tệp theo giai đoạn và không được phân theo giai đoạn. Đồng thời, chúng giúp bỏ qua các tệp chưa được theo dõi và bị bỏ qua trước đó. 

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

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

  • git stash -u hoặc git stash –include-untracked lưu trữ các tệp không được theo dõi.
  • git stash -a hoặc git stash –all lưu trữ các tệp không đượ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 --patch
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 mình, bạn có thể sử dụng các lệnh Git stash list.

Các chuỗi sẽ được lưu theo cách tiếp cận cuối cùng 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 bạn đã tạo kho lưu trữ từ đó. Tuy nhiên, với số lượng thông tin hạn chế sẽ không mang lại cho bạn nhiều lợi ích nếu bạn cần nhiều kho lưu trữ. Vì vậy, điều này sẽ khiến bạn khó ghi nhớ và khó kiểm tra riêng các nội dung của chúng.

Để có thêm mô tả vào kho lưu trữ, bạn có thể áp dụng lệnh Git stash save dưới đây:

$ 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ữ

Đối với việc 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ả 2 lệnh này đều áp dụng lại các thay đổi được lưu trữ trong kho lưu trữ mới nhất. Áp dụng lại các thay đổi trong khi xóa các thay đổi khỏi kho lưu trữ và áp dụng lại chúng vào bản sau đang hoạt động. Git stash pop sẽ là nút lệnh được ưu tiên nếu bạn không cần áp dụng lại các thay đổi đã lưu trữ nhiều lần.

Với nút lệnh này, bạn có thể chọn kho muốn bật hoặc áp dụng cách chuyển mã định danh 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ể thực hiện các lệnh sau:

  • git stash clear làm trống danh sách lưu trữ bằng cách 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 lưu trữ.

Kiểm tra chênh lệch kho lưu trữ:

Để kiểm tra chênh lệch kho lưu trữ, bạn có thể sử dụng lệnh: git stash show <stash_id>. Nút 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 +-

Để có được sự khác biệt chi tiết hơn, hãy chuyển 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<IAppNavHeaderProps>{
  render()

Kiểm tra các chi nhánh mới

Chắc chắn trong quá trình làm việc, bạn đã từng gặp phải tình huống những thay đổi trong nhánh và kho lưu trữ khác nhau. Điều này gây ra những xung đột và bạn phải cố gắng đăng ký lại kho lưu trữ.

Cách khắc phục nhanh nhất lỗi này chính là sử dụng lệnh Git stash branch <new_branch_name stash_id>. Lệnh này tạo ra một nhánh mới dựa trên những cam kết mà kho lưu trữ được tạo ra từ đó. Đồng thời bật các thay đổi được lưu trữ vào nó như sau:

$ git stash branch test_2 stash@{0}
Switched to a new branch 'test_2'
On branch test_2
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .graphqlrc.yml
modified: generated-frontend.ts
modified: package.json
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1)

Lưu trữ mà không làm ảnh hưởng tới bản cập nhập kho

Trong một số trường hợp, bạn cần tạo kho lưu trữ trong khi vẫn giữ nguyên nhật ký tham chiếu kho lưu trữ. Những trường hợp này sẽ phát sinh khi bạn cần một tập lệnh để lưu trữ dưới dạng chi tiết triển khai.

Muốn vậy, bạn hãy truy cập lệnh: git stash create. Lệnh này sẽ tạo một mục nhập kho và trả về tên đối tượng mà chúng không cần đẩy nó vào kho lưu trữ. Cụ thể như sau:

$ git stash tạo "sample stash"
63a711cd3c7f8047662007490723e26ae9d4acf9

Bên cạnh đó, bạn cũng có thể quyết định đẩy mục nhập kho lưu trữ được tạo ra thông qua bản ghi lại kho lưu trữ; 

$ git stash store -m "sample stash testing .." 
"63a711cd3c7f8047662007490723e26ae9d4acf9"
$ git stash list
stash @ { 0 } : sample stash testing ..

Kết luận

Trên đây là bài viết giúp bạn hiểu rõ thêm về Git stash là gì? Cách sử dụng Git stash sao cho đem lại hiệu quả nhất. Chúng tôi mong rằng bài viết trên có thể giúp ích cho các bạn trong quá trình làm việc. 

    Xin vui lòng liên hệ với nhân viên hỗ trợ qua số điện thoại hoặc email bên dưới:
    Điện thoại: (+84)2866-529-333,
    Email: info@onetech.vn
    Hoặc bạn có thể gửi thông tin trực tiếp đến OneTech thông qua mẫu bên dưới:

    Liên hệ

    Xin vui lòng liên hệ với nhân viên hỗ trợ qua số điện thoại hoặc email bên dưới:
    Điện thoại: (+84)2866-529-333, Email: info@onetech.vn
    Hoặc bạn có thể gửi thông tin trực tiếp đến OneTech thông qua mẫu bên dưới:

    Tags: Git, Gitlab

      Xin vui lòng liên hệ với nhân viên hỗ trợ qua số điện thoại hoặc email bên dưới:
      Điện thoại: (+84)2866-529-333,
      Email: info@onetech.vn
      Hoặc bạn có thể gửi thông tin trực tiếp đến OneTech thông qua mẫu bên dưới:

      Liên hệ

      Xin vui lòng liên hệ với nhân viên hỗ trợ qua số điện thoại hoặc email bên dưới:
      Điện thoại: (+84)2866-529-333, Email: info@onetech.vn
      Hoặc bạn có thể gửi thông tin trực tiếp đến OneTech thông qua mẫu bên dưới:

      liên hệ