Hoạt động Stash trong Git



Giả sử bạn đang thực hiện một tính năng mới của sản phẩm của bạn. Code của bạn đang trong tiến trình thực hiện thì đột nhiên một vị khách đến thăm. Bởi vì điều này, bạn phải đi ra ngoài trong một vài giờ. Bạn không thể commit phần code này và cũng không thể quăng nó đi đâu những thay đổi của bạn. Vì thế bạn cần một vài không gian tạm thời, mà tại nơi đó bạn có thể giữ những thay đổi cục bộ này và sau đó quay lại commit nó.

Trong Git, hoạt động stash giúp bạn stash những file đã được chỉnh sửa, những thay đổi, và lưu chúng trên một stack của những thay đổi chưa được hoàn thành, và từ đó bạn có thể ứng dụng lại bất cứ lúc nào.

[jerry@CentOS project]$ git status -s
M string.c
?? string

Bây giờ bạn muốn chuyển branch do một vị khách đến bất ngờ, nhưng bạn không muốn commit những gì bạn đã làm trên đó, vì thế bạn stash những thay đổi đi. Để đẩy những cái stash mới này vào trong stack, bạn chạy lệnh git stash.

[jerry@CentOS project]$ git stash
Saved working directory and index state WIP on master: e86f062 Added my_strcpy function
HEAD is now at e86f062 Added my_strcpy function

Bây giờ thư mục làm việc của bạn đã sạch trơn và tất cả những thay đổi được giữ trên một stack. Hãy cùng thẩm tra lại nó với lệnh git status.

[jerry@CentOS project]$ git status -s
?? string

Bây giờ bạn có thể chuyển branch một cách an toàn và làm bất cứ điều gì. Chúng ta có thể quan sát danh sách của những thay đổi được stash bằng cách sử dụng lệnh git stash list.

[jerry@CentOS project]$ git stash list
stash@{0}: WIP on master: e86f062 Added my_strcpy function

Giả sử bạn đã giải quyết xong việc với vị khách hàng mới đến và bạn quay trở lại làm đoạn code đang dở dang của mình, bạn chỉ cần thực hiện lện git stash pop, để di chuyển những thay đổi từ stack và đặt chúng vào thư mục làm việc hiện tại.

[jerry@CentOS project]$ git status -s
?? string[jerry@CentOS project]$ git stash pop

Lệnh trên sẽ tạo ra kết quả sau:

# On branch master
# Changed but not updated:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
#
modified: string.c
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
#
string
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (36f79dfedae4ac20e2e8558830154bd6315e72d4)[jerry@CentOS project]$ git status -s
M string.c
?? string