Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Git Stash: Giấu code tạm thời

Stashing cho phép lưu code tạm thời trong kho Git.

Khi làm việc với kho Git, bạn có thể sửa file muốn apply vào commit sau. Đó là lúc git stash hữu ích. Stashing lưu code trên nhánh làm việc cho ngày sau. Hướng dẫn này trình bày cơ bản stashing trong Git và cách dùng git stash, kèm ví dụ.

Git Stash là gì?

Stashing lưu code trong working directory và index để dùng sau. Khi viết code, đôi khi muốn lưu thay đổi nhưng chưa commit vào kho.

Ví dụ: báo bug đến. Bạn đang implement feature. Muốn lưu thay đổi feature trước, rồi fix bug. Bug ưu tiên hơn feature đang dev. Muốn fix bug trước, commit bug fix, không muốn bug fix và feature chung commit (commit lớn phức tạp khó đọc lịch sử repo).

Tóm lại: stashing cho phép làm việc khác trong kho Git mà không phải discard hoặc commit code hiện tại.

Stashing lưu ("stash") thay đổi file cho sau. File stashed xong → làm việc khác. Quay lại sau apply thay đổi stash vào code.

Stashing revert working directory về commit cuối. Nghĩa là stash code cho working directory sạch. Directory sạch → sửa thay đổi không lo merge conflict. Không lo tách thay đổi giữa commit.

Cách Stash thay đổi trong Git

Lệnh git stash stash code cho sau. Chạy git stash → thay đổi chưa push commit ở working directory hiện tại lưu cho sau. Bao gồm staged changes (đã git add) và unstaged changes.

Cú pháp:

git stash

Ví dụ: làm website, code trong Git repo. Sửa index.html và index.js. Muốn stash 2 file này để fix bug design ở index.html.

Xem thay đổi bằng git status:

On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
  new file: index.js
Changes not staged for commit:
  modified: index.html

Tạo file mới index.js, sửa index.html. Muốn lưu cho sau, chạy git stash:

git stash

Kết quả:

Saved working directory and index state WIP on master: 3b16026 feat: Launch new homepage

git stash lưu thay đổi cho sau. Chạy git status lại → nothing to commit, working tree clean.

Khi stash, repo revert về commit trước không có thay đổi bạn làm. Thay đổi đã lưu cho sau. Apply khi sẵn sàng bằng stash pop.

Stash thay đổi Untracked

git stash chỉ stash staged/unstaged changes file đã track trong kho Git. Mặc định không include untracked changes.

Staged changes = thay đổi đã add vào staging area. Unstaged changes stash = thay đổi file Git track. Sửa file mới chưa track Git → không add vào stash. File ignored → không add vào stash.

Đây là default preference. Muốn stash untracked file (file mới chưa stage) → dùng cờ -u:

git stash -u

Muốn include ignored file trong stash → dùng cờ -a:

git stash -a

Cờ -a bảo git stash stash thay đổi file ignored (định nghĩa trong .gitignore).

Apply Stashed Changes bằng git stash pop

Lệnh git stash pop apply thay đổi stash vào repo. Ví dụ: muốn apply stash ví dụ trước:

git stash pop

Kết quả:

On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
  new file: index.js
Changes not staged for commit:
  modified: index.html
Dropped refs/stash@{0} (48afd55381cf43f2332f771349c7233fb99f80a6)

Chạy git stash pop → thay đổi từ stash apply vào local working copy. Pop apply code stash vào repo. Sau đó stash rỗng.

git stash pop cũng trả về danh sách thay đổi code, cho biết stash chứa gì.

Dùng git stash apply apply thay đổi nhưng giữ lại trong stash:

git stash apply

Kết quả tương tự nhưng stash không bị xóa.

Apply thay đổi qua nhiều nhánh

Apply cùng stash cho nhiều nhánh là use case tốt. Ví dụ: apply stash cho nhánh này, chuyển nhánh khác, dùng cùng stash apply thay đổi đã lưu.

Nhiều Stashes (Multiple Stashes)

Có thể tạo nhiều stash trong Git. Sửa file này → stash. Sửa file khác → stash riêng.

Theo dõi Stashes

Liệt kê stash trong repo:

git stash list

Kết quả:

stash@{0}: WIP on master: 3b16026 feat: Launch new homepage
stash@{1}: WIP on master: 3b16026 feat: Launch new homepage

Stash dùng default commit message → khó biết stash nào chứa thay đổi gì. Chưa chỉ định description.

Thêm description cho stash mới:

git stash save "add new change to website"

Kết quả: Saved working directory and index state On master: add new change to website. Stash có message riêng.

Apply Multiple Stashes

git stash pop apply stash gần nhất (stash@{0}). Làm việc nhiều stash → có thể muốn apply stash cụ thể.

Chỉ định ID unique của stash muốn apply. Ví dụ apply stash@{1}:

git stash pop stash@{2}

Apply thay đổi stash@{2} vào repo và xóa stash đó.

Tạo nhánh từ Stash

Stashing lưu tạm thay đổi khi làm việc thay đổi khác. Nhưng có lúc muốn chuyển code sang nhánh riêng thay vì giữ stash.

Scenario: conflict khi merge code. Hoặc thay đổi lớn muốn tách nhánh. Dùng git stash branch.

Tạo nhánh mới apply thay đổi stash:

git stash branch <new-branch> <stash-id>

new-branch: ID nhánh tạo. stash-id: ID stash apply code.

Ví dụ: apply stash@{2} vào nhánh mới update-site:

git stash branch update-site stash@{2}

Kết quả: tạo nhánh mới cho stash, apply thay đổi, switch sang nhánh đó, xóa stash (vì code đã lưu trong nhánh).

Xóa Git Stash

Sau khi dùng code trong stash, xóa stash bằng git stash drop:

git stash drop <stash>

Xóa stash@{2}:

git stash drop stash@{2}

Kết quả: Dropped stash@{2} (82079798c950b053fac0efb7b1d5693864dc96e7)

Hoặc xóa tất cả stash repo bằng git stash clear:

git stash clear

Stash file cụ thể

git stash mặc định stash tất cả file tracked trong working directory. Nhưng đôi khi muốn stash file cụ thể.

Dùng git stash push:

git stash push -m "<message>" <file>

message: message gắn với stash. file: tên file stash.

Ví dụ: chỉ stash thay đổi index.html:

git stash push -m "feat: changed index.html file" index.html

Kết quả: Saved working directory and index state On master: feat: changed index.html file. Chỉ index.html vào stash, file khác không thêm.

Xem khác biệt giữa Stashes

Làm việc stash → làm nhiều thay đổi qua nhiều commit trước khi quay lại code stash. Ví dụ: stash code, fix bug, push vài commit fix bug, rồi quay lại stash. Muốn xem tóm tắt khác biệt giữa stash và commit mới nhất (biết đã thay đổi gì kể từ stash).

Dùng git stash show:

git stash show <stash-id>

stash-id: ID stash so sánh với commit mới nhất nhánh. Ví dụ so sánh stash@{1}:

git stash show stash@{1}

Kết quả: index.html | 2 +- index.js | 0 2 files changed, 1 insertion(+), 1 deletion(-). 2 thay đổi: 1 insertion, 1 deletion.

Xem chi tiết diff file bằng cờ -p:

git stash show -p stash@{1}

Kết quả diff đầy đủ: xóa </div> (dấu -), thêm </html> (dấu +) trong index.html.

Kết luận

Lệnh git stash lưu tạm thay đổi codebase. Khi sẵn sàng, quay lại apply thay đổi vào codebase.

Hướng dẫn trình bày cơ bản stashing Git và cách dùng git stash. Bạn đã trang bị kiến thức stash code như Git pro!