Hãy nhìn vào bức hình sau:
Đã bao giờ bạn gặp tình trạng, cái branch đang cần merge (lmao) có xuất hiện commit không mong muốn? Bạn (hoặc khách hàng) thay đổi ý định và không muốn giữ commit "f28e89b" nhưng muốn giữ hai commit phía trên là "5cda8cc" và "04a29d4". Bạn phải làm làm như thế nào?
"Hay là bây giờ mình tạo một cái branch khác, copy sự thay đổi của từng file trong từng commit một, rồi merge sau?" - mình suy nghĩ. Đang copy từng file, từng commit một thì ông đồng nghiệp mình đi ngang qua. Thấy thế, hắn gõ đầu mình một phát, bảo đang làm quần què gì vậy, hất tay mình ra và phô diễn một thứ ma thuật:
GIT CHERRY PICK.
Hắn mở Git graph lên (ở hình dưới đây là Sourcetree, Android Studio cũng có nhé). Hắn hỏi: "Giờ chú muốn lấy commmit nào?". "this commit ok 1
và this commit ok 2
" - mình trả lời. Nói rồi, hắn bấm chuột phải vào commit mình chọn, rồi chọn chữ Cherry Pick:
Kết quả:
Chà, bây giờ thì this commit ok 1
đã xuất hiện ở branch nvbien mà không cần mình phải copy paste từng đoạn code ở từng file một. Ảo thật!
"OK vậy bây giờ, tôi có N commit liên tiếp mà tôi muốn giữ lại, giờ tôi phải dùng tay pick từng cái commit một hả?". Ví dụ, hình bên dưới mình có 3 commit muốn giữ lại là this commit ok 1
(5cda8cc), this commit ok 2
(04a29d4) và this commit ok 3
(f48a7c1).
Lúc này thì ta sẽ dùng cú pháp sau:
git cherry-pick 5cda8cc^...f48a7c1 #DO NOT MISS ^ CHARACTER
Kết quả thu được:
Trong quá trình làm việc của mình thì mình chỉ dùng có nhiêu vậy thôi. Còn khá nhiều chức năng khác của Git Cherry Pick nhưng mình chưa cần dùng đến. Các bạn có thể tham khảo ở Atlassian, Git SCM hoặc Viblo.
P/S: Android Studio Git cũng có chức năng cherry pick, và giao diện của nó trông như thế này:
P/S 2: Cảm tạ bạn Phạm Anh Đức đã chỉ cho skill này.
Một số series mình đang thực hiện:
- Flutter architecture design series: https://medium.com/@nvbien
- Medium Premium translate series: https://viblo.asia/u/nvbien