Git Cherry-pick: Tuyệt chiêu "hái" Commit cực gắt – Cứu cánh cho những pha xử lý đi vào lòng đất
Hãy tưởng tượng một kịch bản "kinh điển": Bạn đang hì hục code tính năng mới trên nhánh feature-x. Bỗng nhiên, sếp báo có bug cực gấp trên production. Bạn chuyển sang nhánh fix-bug, xử lý xong xuôi, commit cẩn thận. Nhưng ô kìa, thay vì commit vào nhánh fix-bug, bạn lại lỡ tay commit mớ đó vào nhánh feature-x (nhánh mà còn lâu mới được merge).
Giờ chẳng lẽ lại copy-paste code bằng tay sang nhánh kia? Đừng làm thế! Đó là lúc bạn cần đến Git Cherry-pick.
1. Git Cherry-pick là gì?
Hiểu đơn giản, cherry-pick là lệnh cho phép bạn chọn một hoặc một vài commit cụ thể từ một nhánh bất kỳ và "bê" nó đắp sang nhánh hiện tại của bạn.
Thay vì merge (lấy toàn bộ lịch sử của nhánh khác) hay rebase (viết lại lịch sử), cherry-pick giúp bạn nhặt đúng cái mình cần mà không kéo theo những thứ linh tinh khác.
2. Các lệnh cơ bản "phải nằm lòng"
Trước khi hái táo, bạn cần biết quả táo đó nằm ở đâu. Hãy dùng git log để lấy mã Hash của commit.
Hái một quả duy nhất
git checkout <nhánh-đích>
git cherry-pick <commit-hash>
Hái nhiều quả cùng lúc Nếu bạn muốn lấy nhiều commit rời rạc:
git cherry-pick <hash-1> <hash-2> <hash-3>
Hái cả một "chùm" táo (Range)
Nếu muốn lấy một dải commit liên tục từ A đến B (trong đó B là commit mới hơn):
git cherry-pick <hash-A>^..<hash-B>
(Lưu ý: Dấu ^ giúp bạn lấy luôn cả commit A, nếu không nó sẽ chỉ lấy từ sau A đến B).
3. Các Option nâng cao để "Pro" hơn
git cherry-pick -n (hoặc --no-commit): "Bê" code sang nhưng không tạo commit mới ngay. Code sẽ nằm ở trạng thái Staging. Việc này cực kỳ hữu ích nếu bạn muốn nhặt vài commit xong mới gộp lại thành 1 commit duy nhất cho gọn.
git cherry-pick -x: Tự động thêm một dòng chú thích vào message commit kiểu: (cherry picked from commit...). Việc này giúp đồng đội biết nguồn gốc của đoạn code này từ đâu ra.
4. Xử lý khi "Táo có sâu" (Conflict)
Đời không như là mơ, đôi khi code ở nhánh đích và commit bạn nhặt về bị xung đột. Khi đó Git sẽ dừng lại và báo: CONFLICT (content): Merge conflict in...
Quy trình xử lý chuẩn 3 bước:
Mở file bị lỗi: Sửa lại các chỗ conflict cho đúng ý đồ.
Add file: git add <tên-file-đã-sửa>.
Tiếp tục hành trình: git cherry-pick --continue.
Nếu cảm thấy "ca này khó quá" hoặc nhặt nhầm, bạn có thể hủy bỏ toàn bộ quá trình bằng lệnh:
git cherry-pick --abort (Mọi thứ sẽ quay về như lúc chưa hái táo).
5. Những lưu ý "Sống còn"
Dù lợi hại, nhưng đừng vì thế mà lạm dụng cherry-pick. Dưới đây là 3 lý do:
Duplicate Commits: Nó tạo ra một commit mới có nội dung y hệt nhưng mã Hash khác. Điều này làm cây thư mục Git của bạn trông rối hơn.
Mất dấu vết: Nếu không dùng option -x, sau này bạn sẽ rất khó biết đoạn code này tại sao lại xuất hiện ở đây.
Vấn đề logic: Có thể commit bạn nhặt về phụ thuộc vào một đoạn code khác ở commit trước đó (mà bạn không nhặt). Điều này dễ dẫn đến lỗi runtime dù code không báo conflict.
Kết luận
Git Cherry-pick là một công cụ mạnh mẽ, là "phao cứu sinh" trong những tình huống oái oăm. Tuy nhiên, hãy dùng nó như một bác sĩ phẫu thuật: Chính xác, dứt khoát và chỉ dùng khi thực sự cần thiết.
Hy vọng bài viết này giúp anh em làm chủ được kỹ thuật "hái táo" và quản lý source code một cách chuyên nghiệp hơn. Nếu thấy hay, đừng quên để lại 1 Upvote và Bookmark nhé!
All rights reserved