Domain 5 · 8 phút đọc

Cherry-pick: áp một commit sang nhánh khác

Cherry-pick: Applying a Single Commit to Another Branch

Đôi khi bạn chỉ muốn lấy đúng một commit từ nhánh khác mà không merge cả nhánh. Cherry-pick làm chính việc đó: áp thay đổi của một commit cụ thể lên nhánh hiện tại như một commit mới.

Cherry-pick hoạt động thế nào

git cherry-pick <hash> lấy diff của commit chỉ định rồi áp nó lên đầu nhánh hiện tại, tạo ra một commit mới (hash khác, nhưng nội dung thay đổi giống hệt).

# Đang đứng trên nhánh main, lấy 1 commit từ nhánh feature
git checkout main
git cherry-pick 9f3a1c2

Bạn cũng có thể áp nhiều commit cùng lúc:

# Áp một dải commit liên tiếp
git cherry-pick a1b2c3d^..e4f5g6h

# Áp vài commit rời rạc
git cherry-pick a1b2c3d e4f5g6h

Khi nào dùng cherry-pick

Use caseMô tả
HotfixSửa lỗi trên nhánh phát triển rồi áp ngay commit fix sang nhánh release đang chạy
BackportĐưa một tính năng/fix từ nhánh mới về nhánh phiên bản cũ vẫn cần hỗ trợ
Lấy nhầm nhánhBạn commit đúng việc nhưng nhầm nhánh — cherry-pick sang nhánh đúng
Tách một commitChỉ cần một thay đổi cụ thể, không muốn kéo cả lịch sử nhánh kia

Xử lý conflict khi cherry-pick

Vì commit gốc dựa trên một bối cảnh khác, áp nó lên nhánh hiện tại có thể gây xung đột conflict. Quy trình giống khi merge conflict:

git cherry-pick 9f3a1c2
# Nếu báo conflict: sửa file thủ công, rồi:
git add <file-da-sua>
git cherry-pick --continue

# Hoặc hủy, trả về trạng thái trước đó:
git cherry-pick --abort

Giữ tham chiếu nguồn

Thêm cờ -x (git cherry-pick -x <hash>) để Git ghi dòng "(cherry picked from commit ...)" vào message, giúp truy vết commit này được chép từ đâu — rất hữu ích khi backport.

Cẩn thận commit trùng lặp

Cherry-pick tạo một commit mới với cùng nội dung. Nếu sau đó bạn lại merge nguyên nhánh nguồn vào, thay đổi đó có thể xuất hiện hai lần trong lịch sử. Hãy ý thức để tránh nhân đôi commit.

Trọng tâm thi

cherry-pick áp một commit cụ thể sang nhánh khác (tạo hash mới), khác với merge/rebase vốn xử lý cả nhánh. Use case kinh điển: hotfixbackport. Conflict được giải bằng --continue / --abort.

Tóm tắt

  • git cherry-pick <hash> chép diff của một commit cụ thể sang nhánh hiện tại thành commit mới.
  • Áp được nhiều commit: liệt kê nhiều hash hoặc dùng dải A^..B.
  • Use case chính: hotfix, backport, sửa commit nhầm nhánh.
  • Conflict xử lý như merge: sửa file → git addgit cherry-pick --continue, hoặc --abort.
  • Dùng -x để ghi lại nguồn; cẩn thận commit trùng lặp nếu sau này merge cả nhánh nguồn.