Git stash, cherry-pick, reset: khi nào dùng lệnh nào cho đúng

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Sau khi nắm add, commit, push, bạn sẽ sớm gặp những tình huống như đang làm dở thì phải sửa gấp lỗi khác, hoặc lỡ commit sai. Ba lệnh stash, cherry-pick và reset giải quyết đúng các tình huống này. Hiểu rõ khi nào dùng lệnh nào sẽ giúp bạn tự tin thao tác mà không sợ mất code.

git stash: cất tạm công việc đang dở

Bạn đang sửa dở một tính năng thì sếp báo có lỗi cần fix ngay trên nhánh khác. Bạn chưa muốn commit code dở dang. Hãy dùng stash:

git stash push -m "dang lam form dang ky"git switch main# ... sửa lỗi gấp, commit ...git switch feature/signupgit stash pop

Một số lệnh stash hữu ích:

  • git stash list: xem danh sách các stash đã cất.
  • git stash pop: lấy stash gần nhất ra và xóa khỏi danh sách.
  • git stash apply: lấy ra nhưng vẫn giữ lại trong danh sách.
  • git stash push -u: cất cả file mới chưa được theo dõi (untracked).
  • git stash drop: xóa một stash không cần nữa.

Hãy luôn đặt thông điệp cho stash bằng -m, nếu không sau vài ngày bạn sẽ không nhớ stash nào chứa gì. Và đừng dùng stash như nơi lưu trữ lâu dài, nếu việc còn dở lâu thì commit lên một nhánh riêng sẽ an toàn hơn.

git cherry-pick: lấy đúng một commit

Đôi khi bạn chỉ muốn lấy một commit cụ thể từ nhánh khác, chẳng hạn bản sửa lỗi bảo mật cần đưa gấp sang nhánh phát hành mà không kéo theo các tính năng khác.

git switch release/1.2git cherry-pick a1b2c3d

Git sẽ tạo một commit mới có cùng nội dung thay đổi (khác mã hash) trên nhánh hiện tại. Nếu có xung đột, bạn xử lý rồi chạy git cherry-pick --continue, hoặc hủy bằng git cherry-pick --abort.

Lưu ý: dùng cherry-pick quá nhiều khiến cùng một thay đổi xuất hiện dưới nhiều mã hash, lịch sử dễ rối. Hãy dùng cho trường hợp cần thiết như hotfix, không thay thế được việc merge thường xuyên.

git reset: di chuyển nhánh về commit cũ

Reset đưa con trỏ nhánh về một commit khác. Có ba chế độ chính, khác nhau ở chỗ xử lý thay đổi:

Chế độLịch sử commitStaging areaFile đang làm việc
--softLùi lạiGiữ nguyên thay đổiGiữ nguyên
--mixed (mặc định)Lùi lạiBỏGiữ nguyên
--hardLùi lạiBỏBỏ, quay về đúng trạng thái commit
# Gộp lại/sửa lại 2 commit gần nhất nhưng giữ codegit reset --soft HEAD~2# Bỏ khỏi staging file lỡ add nhầmgit reset HEAD ten-file.txt# Vứt hết thay đổi, quay về đúng commit cuối (nguy hiểm!)git reset --hard HEAD

Nhớ rằng --hard xóa các thay đổi chưa commit của bạn. Chỉ dùng khi chắc chắn.

reset hay revert?

Đây là câu hỏi quan trọng khi commit đã được push:

  • reset viết lại lịch sử. Phù hợp với commit chỉ tồn tại ở máy bạn. Nếu đã push lên nhánh dùng chung mà reset rồi force push, đồng đội sẽ gặp rắc rối.
  • revert tạo một commit mới đảo ngược thay đổi của commit cũ. An toàn cho nhánh dùng chung vì lịch sử vẫn được giữ.
git revert a1b2c3d

Bảng chọn nhanh theo tình huống

  1. Đang làm dở, cần chuyển nhánh gấp: stash.
  2. Muốn lấy một bản sửa lỗi từ nhánh khác: cherry-pick.
  3. Lỡ commit ở máy mình, chưa push, muốn làm lại: reset --soft hoặc --mixed.
  4. Muốn bỏ hết thay đổi cục bộ: reset --hard (cẩn thận).
  5. Commit tệ đã push lên nhánh chung: revert.

Lưới an toàn: git reflog

Nếu lỡ tay reset sai, đừng hoảng. Lệnh git reflog ghi lại mọi vị trí HEAD từng đi qua trong thời gian gần đây. Bạn có thể tìm commit cũ trong đó và quay về bằng git reset --hard <mã-hash>. Reflog chỉ tồn tại cục bộ và không giữ vĩnh viễn, nhưng thường đủ để cứu bạn trong những phút bối rối đầu tiên.

Kết luận

Stash để cất tạm, cherry-pick để mượn một commit, reset để làm lại lịch sử cục bộ và revert để hoàn tác an toàn trên nhánh chung. Hãy luyện tập trên một repo thử nghiệm để quen tay trước khi dùng cho dự án thật.

Bạn muốn làm chủ Git qua các bài thực hành từng bước? Có thể bắt đầu từ danh mục khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment