Git Cherry-pick
Cập nhật lần cuối
git cherry-pick chép các thay đổi từ một hoặc vài commit cụ thể và áp dụng chúng lên nhánh hiện tại dưới dạng commit mới. Đây là cách lấy riêng một bản sửa lỗi từ nhánh khác mà không phải merge cả nhánh đó, rất hữu ích khi cần đưa một hotfix về nhánh cũ hoặc tách một commit ra khỏi nhánh feature.
Thử các lệnh này trong playground terminal: một shell thật ngay trên trình duyệt, không cần cài đặt gì.
Cú pháp
| Lệnh | Tác dụng |
|---|---|
git cherry-pick <hash> | Áp dụng một commit lên nhánh hiện tại |
git cherry-pick <a> <b> | Áp dụng lần lượt nhiều commit |
git cherry-pick <a>..<b> | Áp dụng một dải commit (không gồm a) |
git cherry-pick -n <hash> | Áp dụng thay đổi nhưng chưa commit |
git cherry-pick -x <hash> | Ghi lại commit gốc trong message |
Trong lúc cherry-pick
Nếu cherry-pick gặp xung đột, hãy giải quyết rồi tiếp tục.
| Lệnh | Tác dụng |
|---|---|
git cherry-pick --continue | Tiếp tục sau khi đã giải quyết xung đột |
git cherry-pick --abort | Hủy và khôi phục nhánh |
git cherry-pick --skip | Bỏ qua commit hiện tại |
Ví dụ minh họa
| Bước | Lệnh | Kết quả |
|---|---|---|
| 1 | git log --oneline hotfix | Tìm hash của bản sửa lỗi, ví dụ a1b2c3d |
| 2 | git switch main | Chuyển sang nhánh cần nhận bản sửa lỗi |
| 3 | git cherry-pick a1b2c3d | Áp dụng bản sửa lỗi vào main thành một commit mới với hash mới |
Câu hỏi thường gặp về git cherry-pick
git cherry-pick dùng để làm gì?
Lệnh này lấy các thay đổi mà một commit cụ thể đưa vào và áp dụng chúng lên nhánh hiện tại thành một commit hoàn toàn mới (với hash mới). Khác với merge hay rebase, nó không mang theo cả một nhánh mà chỉ lấy đúng commit hoặc các commit bạn chỉ định.
Khi nào nên dùng cherry-pick?
main về nhánh release, hoặc lấy riêng một commit hữu ích ra khỏi nhánh feature mà không merge mọi thứ. Nếu bạn muốn cả nhánh, hãy dùng merge hoặc rebase.Làm sao để cherry-pick nhiều commit?
git cherry-pick <a> <b> <c> áp dụng lần lượt từng commit. Với một dải commit liên tiếp, dùng git cherry-pick <start>..<end>, lệnh này áp dụng mọi commit sau start cho đến hết end. Viết <start>^..<end> nếu bạn muốn lấy cả chính start.Nếu cherry-pick gây ra xung đột thì sao?
git add cho kết quả, rồi chạy git cherry-pick --continue. Để rút lui hoàn toàn, dùng git cherry-pick --abort, lệnh này đưa nhánh về trạng thái trước khi bắt đầu cherry-pick.Làm sao để cherry-pick một commit từ nhánh khác?
git log --oneline <other-branch>, chuyển sang nhánh cần nhận commit, rồi chạy git cherry-pick <hash>. Bạn cũng có thể truyền tên nhánh, như git cherry-pick feature, để lấy commit ở đầu nhánh đó.Cherry-pick và merge khác nhau thế nào?
Có thể luyện tập lệnh này online không?
git cherry-pick trong một shell thật ngay trên trình duyệt, không cần cài đặt gì. Khóa học Git tương tác miễn phí của Coddy cũng hướng dẫn chuyển commit giữa các nhánh từng bước.