Git – Stash trở về trạng thái ban đầu

Trong bài này mình sẽ nói về lệnh $ git stash, đây là lệnh dùng để thiết lập trạng thái ban đầu cho tất cả các file nằm trong thư mục làm việc (working directory). Trạng thái ban đầu ở đây chính là nội dung dữ liệu ban đầu của file (so với commit cuối cùng hoặc pull từ remote repository).

Mục lục

1. Lệnh git stash – dùng cho tất cả dữ liệu

Lệnh git stash sẽ có tác dụng với tất cả dữ liệu đang hoạt động trong working directory với điều kiện là dữ liệu đó đã được đưa vào trạng thái Staged hoặc đã từng được committed.

Cú pháp

git stash

Ví dụ: Sau một hồi code cho file demo.php bạn nhận thấy rằng code bị lôi quá nhiều không thể sửa chữa được nữa, vì vậy bạn muốn reset nó về nội dung ban đầu. Sẽ có hai trường hợp như sau:

Trường hợp 1: Nếu file bạn mới tạo, chưa đưa vào stage (chưa sử dụng lệnh add)

Trường hợp này bạn chỉ cần xóa hết nội dung là được, bởi file chưa đưa vào khu vực tổ chức (stage).

Trường hợp 2: File đã được đưa vào stage hoặc đã tồn tại trước đó (được committed).

Trường hợp này bạn sẽ chạy lệnh $ git stash để đưa nội dung của file về trạng thái ban đầu.

git stash

Kết quả bạn nhận được dạng như sau: 

Saved working directory and index state WIP on master: 7d84ae1 sd 
HEAD is now at 7d84ae1 sd

Lưu ý: Khi bạn gọi git stash thực chất bạn đang gọi tắt, lệnh full sẽ là git stash save.

2. Các tham số của git stash

Chúng ta có một số tham số đằng sau lệnh stash, mỗi tham số có một ý nghĩa và công dụng khác nhau.

$ git stash list

Xem danh sách bao nhiêu lệnh stash đã dùng.

Giả sử bạn đã stash rất nhiều lần và muốn xem danh sách và địa chỉ của nó thì chạy lệnh $ git stash list.

Xem danh sách stash

git stash list

Kết quả dạng thế này

stash@{0}: WIP on master: 7d84ae1 sdstash@{1}: WIP on master: 7d84ae1 sd

$ git stash pop

Xóa một stash ra khỏi lịch sử.

Lệnh này sẽ không thực thi nếu có xảy ra xung đột, lúc này bạn cần phải xử lý thủ công bằng tay và sử dụng lệnh git stash drop để thay thế.

Lệnh này có thêm một tham số đó là  $ git stash drop <stash>. Nếu bạn không truyền stash thì mặc định nó sẽ lấy stash đầu tiên stash@{0}.

Xem danh sách stash

git stash list

Xóa stash có địa chỉ là stash@ttbinh

git stash pop stash@{1}

$ git stash apply

Phục hồi lệnh stash, không xóa khỏi history.

Nếu bạn muốn phục hồi tất cả các lệnh stash, tức là lấy lại nội dung trước khi chạy lệnh stash thì dùng tham số apply.

Phục hồi

git stash apply

$ git stash show

Xem chi tiết của một stash, so sánh nó với dữ liệu ban đầu.

Nếu bạn muốn xem chi tiết dữ liệu lúc chạy lệnh stash so với thời điểm ban đầu thì sử dụng tham số show.

Xem chi tiết stash

git stash show

Nó có một tham số đó là địa chỉ của stash muốn xem $ git stash show <stash>. Nếu bạn không truyền <stash> thì mặc định nó sẽ lấy stash mới nhất.

$ git stash clear

Nếu bạn muốn xóa tất cả stash ra khỏi history thì sử dụng tham số clear.

git stash clear

Xóa lịch sử stash

Bạn hãy thử chạy lại lệnh git stash list thì sẽ thấy danh sách rỗng.

$ git stash drop

Nếu bạn muốn xóa một stash thôi thay vì xóa tất cả thì sử dụng lệnh git stash drop <stash>.

Nếu bạn không truyền giá trị <stash> thì nó sẽ xóa stash cuối cùng.

Trước tiên chúng ta xem danh sách stash đã nhé.

git stash list
stash@{0}: WIP on master: 7d84ae1 
sdstash@{1}: WIP on master: 7d84ae1 sd

Giả sử cần xóa stash@{0} thì viết lệnh như sau:

git stash drop stash@{0}

Điểm khác biệt  so với lệnh git stash pop là khi không truyền tham số <stash> thì nó xóa stash cuối cùng, còn pop thì xóa stash đầu tiên.

$ git stash save

Lệnh git stash create dùng để tạo một stash nhưng không lưu trữ vào thư mục refs mà thay vào đó trả về tên của object. lệnh này rất ít khi sử dụng. Lệnh này 

$ git stash store

Nếu bạn lỡ sử dụng lệnh stash save nhưng sau muốn lưu nó vào thư mục refs thì sử dụng tham số store.

3. Lời kết

Như vậy làm mình đã giới thiệu sơ lược về cách sử dụng lệnh stash để thiết lập trạng thái ban đầu của các file trong thư mục làm việc. Khi sử dụng stash bạn phải cân nhắc thật kỹ để tránh mất dữ liệu và phải làm lại từ đầu.

Nếu bạn đã lỡ stash rồi thì không sao, hãy vận dụng các tham số mà git đã cung cấp để phục hồi một cách nhanh và chính xác nhất.