Git cherry-pick cho phép bạn sao chép các thay đổi từ một commit cụ thể sang một branch đích. Không giống như merge hoặc rebase, cherry-pick cho phép tích hợp chọn lọc các thay đổi riêng lẻ mà không cần phải hợp nhất toàn bộ branch. Điều này rất hữu ích khi bạn chỉ muốn lấy những sửa lỗi hoặc tính năng riêng biệt.
Bắt đầu bằng cách lấy mã hash của commit (hoặc các commit) bạn muốn pick:
git log <branch-name> --oneline
Lệnh này sẽ hiển thị danh sách các commit với hash ngắn gọn và message, giúp bạn dễ dàng xác định commit cần cherry-pick.
Cherry-pick sẽ sao chép các commit đã chọn lên branch hiện tại, vì vậy hãy đảm bảo bạn đã checkout branch đích trước khi cherry-pick:
git switch <target-branch>
Sử dụng lệnh git cherry-pick để sao chép commit đã chọn lên branch hiện tại:
git cherry-pick <commit-hash>
Cherry-pick sẽ áp dụng các thay đổi chứa trong một (hoặc nhiều) commit lên branch hiện tại. Nếu những thay đổi trong các commit bạn cherry-pick bị xung đột với những thay đổi trên branch hiện tại, bạn sẽ gặp phải merge conflict.
Khi gặp xung đột, Git sẽ tạm dừng thao tác cherry-pick và yêu cầu bạn giải quyết xung đột thủ công. Sau khi giải quyết xong, bạn có thể tiếp tục bằng:
git cherry-pick --continue
Hoặc nếu muốn hủy bỏ và quay lại trạng thái ban đầu:
git cherry-pick --abort
Để cherry-pick nhiều commit riêng lẻ, hãy truyền từng mã hash của commit cho git cherry-pick như bên dưới:
git cherry-pick <commit-1-hash> <commit-2-hash>
Các commit sẽ được áp dụng theo thứ tự chúng xuất hiện. Trong ví dụ trên, commit-1 sẽ được pick trước, sau đó là commit-2 và cứ thế tiếp tục.
Git cung cấp nhiều cú pháp khác nhau để chọn phạm vi các commit. Ví dụ, để cherry-pick một phạm vi các commit, hãy sử dụng cú pháp ~.. như bên dưới:
git cherry-pick <commit-1-hash>~..<commit-2-hash>
Lệnh này hướng dẫn Git pick tất cả các commit xuất hiện giữa commit-1 và commit-2 (bao gồm cả hai).
Lưu ý: Cú pháp ~.. có nghĩa là từ commit ngay trước commit-1 (do ~ đại diện cho commit cha) đến commit-2. Nếu bạn muốn bao gồm cả commit-1, hãy sử dụng:
git cherry-pick <commit-1-hash>^..<commit-2-hash>
Xung đột merge có thể phát sinh nếu các thay đổi được giới thiệu bởi một commit đã cherry-pick can thiệp vào các commit trên branch đích. Trong các tình huống xung đột này, Git sẽ tạm dừng thao tác cherry-pick và yêu cầu giải quyết xung đột thủ công.
Để tiếp tục, hãy giải quyết và stage các file bị xung đột. Sau đó tiếp tục bằng cách thực thi:
git cherry-pick --continue
Thay vì giải quyết, bạn cũng có thể hủy bỏ và quay lại bằng cách chạy:
git cherry-pick --abort
Quy trình giải quyết xung đột khi cherry-pick tương tự như giải quyết merge conflict: bạn cần mở các file bị xung đột, chỉnh sửa để giải quyết xung đột, sau đó stage các file đã sửa và tiếp tục cherry-pick.
Cherry-pick tạo ra các commit mới với nội dung giống như commit gốc, nhưng với hash khác nhau vì chúng có parent khác nhau.
Cherry-pick hữu ích khi bạn chỉ muốn áp dụng một số commit cụ thể từ một branch sang branch khác mà không muốn merge toàn bộ branch.
Hãy cẩn thận khi cherry-pick các commit đã được chia sẻ, vì điều này có thể tạo ra các commit trùng lặp trong lịch sử.
Nếu bạn cherry-pick một commit đã tồn tại trong branch đích (theo nội dung), Git sẽ báo lỗi. Bạn có thể sử dụng cờ --allow-empty nếu cần.
Cherry-pick cho phép bạn chọn lọc và sao chép các commit cụ thể từ branch này sang branch khác một cách chính xác. Quy trình cơ bản bao gồm ba bước: chọn commit, chọn branch đích, và thực thi cherry-pick. Bạn cũng có thể cherry-pick nhiều commit hoặc một phạm vi commit, và giải quyết xung đột nếu chúng phát sinh.
Cherry-pick là một công cụ mạnh mẽ để quản lý các thay đổi một cách chọn lọc, đặc biệt hữu ích khi bạn chỉ muốn áp dụng một số sửa lỗi hoặc tính năng cụ thể mà không merge toàn bộ branch.
Tiếp theo: Stash