[Git nâng cao] Cách dùng Git Stash xử lý các thay đổi chưa hoàn thành

Bạn đã bao giờ rơi vào tình huống: đang code dở dang một tính năng quan trọng thì sếp đột ngột yêu cầu "fix bug gấp"? Hoặc bạn đang thử nghiệm một ý tưởng mới, code còn chưa đâu vào đâu thì lại cần phải chuyển sang một nhánh khác để review code cho đồng nghiệp? Những thay đổi còn đang ngổn ngang, chưa thể commit vì chưa hoàn thiện, nhưng cũng không thể bỏ đi. Đây chính là lúc Git Stash tỏa sáng như một "vị cứu tinh". 🦸‍♂️

Cách dùng Git Stash xử lý các thay đổi chưa hoàn thành

Vậy, Git Stash là gì?

Hiểu một cách đơn giản nhất, git stash là một lệnh trong Git cho phép bạn lưu tạm thời những thay đổi chưa được commit (staged và unstaged files) vào một "kho chứa bí mật" gọi là "stash". Sau khi lưu lại, workspace của bạn sẽ trở về trạng thái "sạch sẽ" như lần commit cuối cùng, giúp bạn an toàn chuyển nhánh, pull code mới, hoặc làm bất cứ việc gì khác mà không sợ bị xung đột hay mất mát những gì đang làm dở. Khi cần, bạn có thể dễ dàng "lôi" những thay đổi đó ra từ "kho" và tiếp tục công việc.

Hãy tưởng tượng bạn đang viết dở một bức thư tay. Bỗng có chuông cửa, một người bạn ghé chơi. Bạn không thể để bức thư dang dở trên bàn, nhưng cũng chưa viết xong để cất vào phong bì. Giải pháp là bạn tạm thời cất nó vào ngăn kéo. git stash cũng hoạt động tương tự như chiếc ngăn kéo đó cho code của bạn.

Tại sao và khi nào nên dùng Git Stash? 🤔

git stash không chỉ là một lệnh hay ho, nó là một công cụ cực kỳ hữu ích giúp quy trình làm việc của bạn trở nên mượt mà và hiệu quả hơn. Dưới đây là những tình huống phổ biến mà bạn sẽ thấy "yêu" git stash:

  • "Fix bug" khẩn cấp: Đây là kịch bản kinh điển nhất. Bạn đang phát triển một tính năng mới, code còn bề bộn, thì một bug nghiêm trọng trên nhánh main cần được sửa ngay lập tức. Bạn không thể commit code dang dở, nhưng cần chuyển qua nhánh main. git stash sẽ giúp bạn cất gọn mọi thứ, chuyển nhánh, sửa bug, sau đó quay lại và khôi phục công việc một cách dễ dàng.
  • Chuyển đổi ngữ cảnh (Context Switching): Khi bạn cần chuyển sang một nhánh khác để xem xét, thử nghiệm hoặc hỗ trợ đồng đội mà không muốn commit những thay đổi hiện tại.
  • Cập nhật code từ remote: Bạn muốn thực hiện git pull để lấy code mới nhất từ server, nhưng lại có những thay đổi cục bộ chưa commit. Nếu pull trực tiếp có thể gây ra xung đột (conflict). Cách an toàn nhất là stash những thay đổi của bạn, pull code mới, sau đó pop stash ra và giải quyết xung đột (nếu có) một cách gọn gàng.
  • Thử nghiệm một ý tưởng điên rồ: Bạn muốn thử một giải pháp mới nhưng không chắc nó sẽ hoạt động. Thay vì tạo một nhánh mới chỉ để thử nghiệm, bạn có thể viết code trực tiếp, sau đó stash lại nếu thấy không ổn.

Hướng dẫn chi tiết cách sử dụng Git Stash

Việc sử dụng git stash vô cùng trực quan. Dưới đây là những lệnh cơ bản và phổ biến nhất mà bạn cần nắm vững.

Hướng dẫn cách sử dụng Git Stash

1. Cất giấu thay đổi: git stash

Đây là lệnh cơ bản nhất. Khi bạn ở trong thư mục dự án và có những thay đổi chưa commit, chỉ cần gõ:

git stash

Hoặc để thêm một thông điệp mô tả cho stash (rất hữu ích khi bạn có nhiều stash), hãy dùng:

git stash save "Đang làm dở tính năng X, cần fix bug Y"

Sau khi lệnh này chạy, Git sẽ "dọn dẹp" working directory của bạn.

2. Xem danh sách các stash: git stash list

Bạn đã cất bao nhiêu thứ vào "ngăn kéo"? Lệnh này sẽ cho bạn biết:

git stash list

Kết quả sẽ trông giống như thế này:

stash@{0}: On feature-branch: Đang làm dở tính năng X, cần fix bug Y
stash@{1}: WIP on main: 4a5de2e Add new feature

Mỗi stash được định danh bằng một chỉ số stash@{n}. Stash mới nhất luôn là stash@{0}.

3. Lấy lại thay đổi gần nhất: git stash pop

Khi bạn đã sẵn sàng tiếp tục công việc dang dở, hãy dùng git stash pop. Lệnh này sẽ làm hai việc:

  1. Áp dụng lại những thay đổi từ stash gần nhất (stash@{0}).
  2. Xóa stash đó khỏi danh sách.
git stash pop

Lưu ý: Nếu có xung đột (conflict) xảy ra khi pop, stash sẽ không bị xóa tự động. Bạn cần giải quyết xung đột trước, sau đó xóa stash thủ công.

4. Áp dụng stash nhưng không xóa: git stash apply

Nếu bạn muốn áp dụng một stash nhưng vẫn muốn giữ nó lại trong danh sách (để có thể áp dụng cho một nhánh khác chẳng hạn), hãy dùng git stash apply:

git stash apply

Lệnh này sẽ áp dụng stash gần nhất. Nếu muốn áp dụng một stash cũ hơn, bạn cần chỉ rõ định danh của nó:

git stash apply stash@{2}

5. Xóa stash: git stash dropgit stash clear

Sau khi đã apply và chắc chắn không cần đến stash đó nữa, bạn có thể xóa nó đi bằng git stash drop:

git stash drop stash@{2} # Xóa một stash cụ thể

Nếu không chỉ định, lệnh sẽ xóa stash gần nhất (stash@{0}).

Để "dọn dẹp" toàn bộ "ngăn kéo", xóa tất cả các stash, hãy dùng:

git stash clear

Cảnh báo: Hãy cẩn thận với lệnh này, vì nó sẽ xóa toàn bộ lịch sử stash của bạn mà không có cách hoàn tác.

Các tùy chọn nâng cao với Git Stash

Ngoài các lệnh cơ bản, git stash còn có một vài "chiêu thức" nâng cao cực kỳ mạnh mẽ.

  • Stash cả file untracked: Mặc định, git stash chỉ lưu các file đã được theo dõi (tracked files). Nếu bạn muốn cất cả những file mới tạo (untracked files), hãy thêm cờ -u hoặc --include-untracked:
    git stash -u
    
  • Stash cả file bị ignore: Để stash "tất tần tật", bao gồm cả những file trong .gitignore, dùng cờ -a hoặc --all:
    git stash -a
    
  • Stash một phần file (Stash patch): Đây là một tính năng cực kỳ hay. Nếu bạn chỉ muốn stash một vài thay đổi cụ thể trong một file, thay vì toàn bộ file, hãy dùng cờ -p hoặc --patch:
    git stash -p
    
    Git sẽ đi qua từng "khối" thay đổi (hunk) và hỏi bạn có muốn stash nó không.

Kết luận: Git Stash là công cụ đơn giản nhưng hữu ích

git stash là một công cụ đơn giản nhưng vô cùng mạnh mẽ, là một phần không thể thiếu trong bộ kỹ năng của bất kỳ lập trình viên chuyên nghiệp nào. Nó giúp bạn quản lý công việc một cách linh hoạt, giữ cho working directory luôn sạch sẽ và giảm thiểu rủi ro khi phải chuyển đổi ngữ cảnh liên tục.

Lần tới, khi sếp bất ngờ gọi bạn đi "chữa cháy", đừng hoảng sợ. Hãy bình tĩnh gõ git stash, mỉm cười và nói: "Để em!". 😉 Chúc bạn mastering Git và có những dòng code tuyệt vời!

Bài viết liên quan

[Git nâng cao] Hướng dẫn Git Rebase: Hiểu rõ và sử dụng hiệu quả

Git Rebase dùng để sắp xếp lại, kết hợp và thay đổi các commit. Bài viết này sẽ giúp bạn phân biệt Git Rebase và Git Merge, đồng thời nắm vững cách dùng Git Rebase hiệu quả, an toàn.

[Git cơ bản] Cách dùng Git log: Nắm lịch sử commit trong lòng bàn tay

Bạn muốn xem lại lịch sử thay đổi của dự án? Hướng dẫn chi tiết cách dùng lệnh git log từ cơ bản đến nâng cao, giúp bạn quản lý các commit hiệu quả và dễ dàng hơn.

[Git nâng cao] Git Tag là gì? Cách dùng và cách ứng dụng trong thực tế

Bạn muốn đánh dấu các phiên bản quan trọng của dự án? Git Tag chính là công cụ bạn cần. Tìm hiểu cách sử dụng Git Tag để dễ dàng theo dõi và quản lý các bản release, từ đó nâng cao hiệu suất làm việc.

[Git nâng cao] Git reflog: Phục hồi lịch sử commit và mọi thao tác trong Git

Git reflog là gì? Hướng dẫn chi tiết cách dùng lệnh git reflog để xem lại lịch sử các thao tác và khôi phục những thay đổi, đảm bảo bạn không bao giờ mất code nữa.