Series Git Nâng Cao - phần II: git stash

Khi bạn đang làm dở một task và muốn chuyển sang một branch khác để làm việc gì đó, lúc này bạn không muốn chạy git reset --hard để loại bỏ những thay đổi đã được commit của bạn hoặc commit công việc đang làm dở thì đây là lúc lệnh git stash phát huy tác dụng của nó.

Khi bạn đang làm dở một task và muốn chuyển sang một branch khác để làm việc gì đó, lúc này bạn không muốn chạy git reset --hard để loại bỏ những thay đổi đã được commit của bạn hoặc commit công việc đang làm dở thì đây là lúc lệnh git stash phát huy tác dụng của nó.

Hãy tưởng tượng git stash 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 từ nhanh khác quay trở về, 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.

1. Git stash save

Đơn giản thì lệnh này cũng giống như khi bạn gõ git commit vậy. Cái khác là lệnh này có những option khác nhau. Có một số option khá hay, tôi sẽ trải ra ở dưới đây.

Git stash cùng mới một message kèm theo

git stash save "Message"

Lưu ý: Lệnh này sẽ không lưu các file untracked

Git stash lưu những file không được theo dõi (untracked files)

git stash save -u
or
git stash save --include-untracked

2. Git stash list

Khi dùng lệnh này bạn có thể xem lại danh sách các stash đã lưu lại khi dùng lệnh:

git stash list

Chúng ta sẽ được kết quả như sau:

Đây là danh sách các stashes mà bạn tạo ra, và cái gần nhất bạn tạo nó ở trên đầu đó.

Nếu muốn xem cả nội dung của từng thay đổi thì thêm option -p

git stash list -p

hoặc xem nội dung cụ thể hơn nữa của lần thay đổi thứ 1

git stash show stash@{1}

3. 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. đúng kiểu stack, vào cuối - ra đầu. Trên ví dụ trên thì nó sẽ apply stash@{0}.vvi

git stash apply

Khi bạn muốn apply một stash có khác thì đơn giản là ta sẽ dùng với id của stash đó

git stash apply stash@{1} // apply stash có id là 1

4. Git stash pop

Lệnh này cũng như git stash apply nhưng khác biệt ở chỗ là nó sẽ xóa luôn cái stash đó ra khỏi danh sách các stash của bạn

git stash pop // lấy ra stash gần nhất và xóa nó khỏi danh sách

Nếu bạn muốn chỉ định lấy ra một stash nào đó thì cũng làm giống stash apply thôi

git stash pop stash@{1}

5. Git stash show

Lệnh này hiện thị khá ngắn gọn những thay đổi của stash diff. tương tự, nó chỉ xem của thằng stash cuối cùng thôi.

git stash show

Bạn muốn xem đầy đủ thì thêm -p vào nhé

git stash show -p

Còn muốn hiển thị stash diff của stash khác thì tương tự như mấy lệnh trên, chỉ cần thêm id của nó vào là được

git stash show stash@{1}


6. 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 xóa 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 khi 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.

7. Git stash clear

Xoá toàn bộ stash bạn đang lưu trữ trong repo. nó có thể sẽ không revert lại được nên chú ý nhé!

git stash clear

8. Git stash drop

Xoá đi stash gần nhất, có thể "không revert" được

git stash drop

Xoá đi stash cụ thể bằng việc thêm id bạn muốn vào, có thể "không revert" được

git stash drop stash@{id}


9. Một số trường hợp nên dùng git stash.

Trường hợp 1:

Giả sử bạn đang phát triển một tính năng mới. Bạn code điên đảo. Mọi thứ hoạt động đều trơn tru, tốt đẹp. Rồi bạn quyết định sẽ commit và push chúng lên Remote. Nhưng... bạn chợt nhận ra, mình đang code trong nhánh "master". Mà đang lẽ ra, bạn phải code trong nhánh "dev". Bây giờ phải làm sao đây? Bạn sẽ copy-paste phần code thay đổi ra một nơi khác. Sau đó, bạn checkout nhánh "dev" để paste phần code thay đổi vừa rồi vào. Cũng được đấy chứ? Mà làm thủ công như vậy khá mất thời gian. Thay vào đó, bạn có thể sử dụng tính năng "stash" có sẵn của Git, bằng cách làm theo các bước sau đây.
Giải pháp:

Bước 1: Lưu lại toàn bộ sự thay đổi

git stash save

Bước 2: Di chuyển sang nhánh mà bạn mong muốn, giả sử là nhánh "dev"

git checkout dev

Bước 3: Cập nhật sự thay đổi vào nhánh "dev"

git stash pop

Xong bước này nghĩa là bạn đã thành công trong việc di chuyển sự thay đổi ở một nhánh sang nhánh khác trong Git. Bây giờ, bạn chỉ cần commit rồi push chúng lên Remote thôi hoặc làm gì đó khác mà bạn thích.

Trường hợp 2:

Git stash được sử dụng khi muốn lưu lại các thay đổi chưa commit, thường rất hữu dụng khi bạn muốn đổi sang 1 branch khác mà lại đang làm dở ở branch hiện tại. Khi này branch đã trở nên "sạch sẽ" và git status sẽ cho thấy bạn có thể chuyển sang branch tuỳ thích.