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).
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.
$ 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)
Bài viết này được đăng tại [free tuts .net]
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
.
$ git stash list
stash@{0}: WIP on master: 7d84ae1 sd stash@{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}
.
$ git stash list
Xóa stash có địa chỉ là stash@{1}
.
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.
$ 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.
$ 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
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 sd stash@{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.