Giao diện
1. Cherry-pick (Chọn lọc)
IMPORTANT
ROLE: Engineer HPN (The Fixer). SCENARIO: Bạn sửa xong một bug nghiêm trọng trên branch dev. Sếp yêu cầu đưa chính xác cái fix đó lên prod NGAY LẬP TỨC để cứu hệ thống, nhưng không được merge toàn bộ dev (vì dev đang chứa đầy code rác chưa test).
1.1 The Magic Command
git cherry-pick cho phép bạn "nhặt" một commit cụ thể từ nhánh này và đắp sang nhánh khác.
bash
git cherry-pick <commit-hash>1.2 Quy trình thực chiến
Giả sử commit fix bug là a1b2c3d nằm trên nhánh dev.
Chuyển sang nhánh nhận (Prod):
bashgit switch prodNhặt commit:
bashgit cherry-pick a1b2c3dPush cứu hỏa:
bashgit push origin prod
1.3 Tips
- Cherry-pick nhiều commit:
git cherry-pick a1b2c3d..e5f6g7h(Lấy từ A đến E). - Conflict: Nếu có conflict, xử lý như merge bình thường, sau đó
git cherry-pick --continue.
WARNING
Cherry-pick làm thay đổi Hash ID của commit. Lạm dụng nó sẽ tạo ra duplicate commits (cùng nội dung nhưng khác ID) gây rối lịch sử. Chỉ dùng cho Hotfix.
🧠 Quiz
Câu 1: git cherry-pick được sử dụng tốt nhất trong tình huống nào?
- [ ] A) Khi muốn merge toàn bộ branch
- [x] B) Khi cần áp dụng một hotfix cụ thể từ branch khác mà không merge toàn bộ
- [ ] C) Khi muốn xóa một commit khỏi lịch sử
- [ ] D) Khi muốn tạo branch mới
💡 Giải thích: Cherry-pick lý tưởng cho hotfix - khi cần lấy đúng một commit sửa lỗi từ branch khác áp dụng vào production mà không kéo theo các thay đổi chưa sẵn sàng.
Câu 2: Hệ quả quan trọng nhất khi lạm dụng cherry-pick là gì?
- [ ] A) Repository bị chậm đi
- [x] B) Tạo ra duplicate commits (cùng nội dung nhưng khác SHA), gây rối lịch sử
- [ ] C) Xóa commit gốc khỏi branch nguồn
- [ ] D) Conflict tự động xuất hiện ở mọi branch
💡 Giải thích: Cherry-pick tạo commit MỚI với SHA khác (vì parent khác). Lạm dụng sẽ tạo nhiều commits trùng nội dung nhưng khác ID, làm lịch sử rối và khó track. Chỉ nên dùng cho hotfix.
Câu 3: Để cherry-pick một dãy commits liên tiếp, cú pháp đúng là gì?
- [ ] A)
git cherry-pick commit1 commit2 commit3 - [x] B)
git cherry-pick commit1..commit3(không bao gồm commit1) - [ ] C)
git cherry-pick --range commit1 commit3 - [ ] D)
git cherry-pick commit1:commit3
💡 Giải thích: Cú pháp
git cherry-pick A..Bcherry-pick tất cả commits sau A đến B (không bao gồm A). Nếu muốn bao gồm cả A, dùnggit cherry-pick A^..B.