Skip to content

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.

  1. Chuyển sang nhánh nhận (Prod):

    bash
    git switch prod
  2. Nhặt commit:

    bash
    git cherry-pick a1b2c3d
  3. Push cứu hỏa:

    bash
    git 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..B cherry-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ùng git cherry-pick A^..B.