Git cherry-pick là gì

Hôm nay mình gặp phải một trường hợp cần apply cùng một thay đổi cho cả 2 branches khác nhau trong project.

Giả sử bạn có 2 branches khác nhau cho 2 khách hàng khác nhau, tạm gọi là branch A và branch B. Và bạn đang fix một bug nghiêm trọng cùng tồn tại trên hệ thống của cả 2 khách hàng, bạn muốn chỉ commit một lần nhưng có thể apply vào luôn cả 2 branches.

Bạn có thể dùng lệnh cherry-pick của Git để giải quyết, như sau:

// Đang ở branch A, commit những thay đổi đógit add -Agit commit -m "Awesome Bug Fixed :["// Chuyển qua branch B và thực hiện lệnh cherry-pick git checkout Bgit cherry-pick Acherry-pick sẽ lấy commit cuối cùng ở branch A merge vào branch B.

Ngoài ra, bạn còn có thể chỉ định danh sách các commit cần "bốc" từ A để "bỏ" vào B nếu cần thiết.

Bạn đang xem: Cherry pick là gì

Chia sẻ bài viết với bạn bè nữa nhé! facebook google plus twitter Bình luận {{ comment.user.name }} {{ comment.updated_at }} Xoá bình luận Bỏ hay Hay {{comment.like_count}}

{{ comment_error }} Hủy

Hiển thị thử

Chỉnh sửa


Huy Trần

120 bài viết. 2067 người follow diyxaqaw.com {{userFollowed ? "Following" : "Follow"}} Cùng một tác giả 186 46 Làm thế nào để viết blog kĩ thuật? writing blogging Tại sao phải viết blog kĩ thuật? Có rất nhiều bài viết trên mạng nói về vấn đề tại sao một lập trình viên nên thường xuyên viết các bài blog kĩ thu... Huy Trần viết gần 6 năm trước 186 46 157 39 Phức tạp hoá vấn đề: Phân tích và mô phỏng nút cảm xúc của Facebook UI CSS CSS3 Animation [Ảnh] Tiếp tục sêri [Link] lần này, chúng ta sẽ cùng tìm hiểu và mô phỏng lại một chức năng mà mọi người đang bắt đầu sử dụng hằng ngày, đó là chứ... Huy Trần viết gần 5 năm trước 157 39 121 19 Lập trình và Toán học math code developer Phần 1: Tự truyện Tui và Toán đã từng là hai kẻ thù không đội trời chung trong suốt hơn mười lăm năm ròng rã. Ngay từ ánh nhìn đầu tiên đã ghét nh... Huy Trần viết gần 5 năm trước 121 19 0 5 fCC: Technical Documentation Page TIL fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ... HungHayHo viết gần 3 năm trước 0 5 4 0 Spring JPA fetch test TIL spring spring boot spring jpa fetch I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this [Link], I want to check how Spring J... Rey viết hơn 2 năm trước 4 0

{{like_count}}

diyxaqaw.com


{{ comment_count }}

bình luận

{{liked ? "Đã diyxaqaw.com" : "diyxaqaw.com"}} {{userFollowed ? "Following" : "Follow"}} 120 bài viết. 2067 người follow

Đầu mục bài viết


Vẫn còn nữa! x

diyxaqaw.com vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!

Khám phá Đăng nhập

Xem thêm: #1 Tiểu Sử Ca Sĩ Mờ Naive Profile, Ca Sĩ Mờ Naive

Điều khoản Phản hồi Yêu cầu Fanpage

Hôm nay mình gặp phải một trường hợp cần apply cùng một thay đổi cho cả 2 branches khác nhau trong project.

Giả sử bạn có 2 branches khác nhau cho 2 khách hàng khác nhau, tạm gọi là branch A và branch B. Và bạn đang fix một bug nghiêm trọng cùng tồn tại trên hệ thống của cả 2 khách hàng, bạn muốn chỉ commit một lần nhưng có thể apply vào luôn cả 2 branches.

Bạn có thể dùng lệnh cherry-pick của Git để giải quyết, như sau:

// Đang ở branch A, commit những thay đổi đó git add -A git commit -m "Awesome Bug Fixed :[" // Chuyển qua branch B và thực hiện lệnh cherry-pick git checkout B git cherry-pick A

cherry-pick sẽ lấy commit cuối cùng ở branch A merge vào branch B.

Ngoài ra, bạn còn có thể chỉ định danh sách các commit cần "bốc" từ A để "bỏ" vào B nếu cần thiết.

Xem thêm thông tin về cherry-pick tại đây

huytd 07-09-2016

Cùng một tác giả

191 46

Tại sao phải viết blog kĩ thuật? Có rất nhiều bài viết trên mạng nói về vấn đề tại sao một lập trình viên nên thường xuyên viết các bài blog kĩ thu...

159 39

[Ảnh] Tiếp tục sêri [Link] lần này, chúng ta sẽ cùng tìm hiểu và mô phỏng lại một chức năng mà mọi người đang bắt đầu sử dụng hằng ngày, đó là chứ...

123 19

Phần 1: Tự truyện Tui và Toán đã từng là hai kẻ thù không đội trời chung trong suốt hơn mười lăm năm ròng rã. Ngay từ ánh nhìn đầu tiên đã ghét nh...

Bài viết liên quan

1 5

fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...

4 0

I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this [Link], I want to check how Spring J...

Tại hướng dẫn này, sẽ sử dụng local repository mà lịch sử trước đó đã được chuẩn bị

Hãy tải xuống từ đây.

Di chuyển đến thư mục stepup-tutorial/tutorial4. Lịch sử của repository này sẽ thành trạng thái hiển thị bằng sơ đồ bên dưới.

Tại đây, lấy vào nhánh master chỉ thay đổi có tên [Thêm giải thích commit] đã được thực hiện tại branch khác

Sau khi đã di chuyển đến branch master, sử dụng cherry-pick, lấy ra commit [Thêm giải thích commit] rồi thêm vào master.

[commit "99daed2" trong tài liệu và commit trong repository đã tải xuống có thể khác nhau. Hãy chạy git log bằng repository đã tải xuống, kiểm tra rồi sử dụng commit thích hợp.]

$ git checkout master Switched to branch 'master' $ git cherry-pick 99daed2 error: could not apply 99daed2... commit hint: after resolving the conflicts, mark the corrected paths hint: with 'git add ' or 'git rm ' hint: and commit the result with 'git commit'

Đã phát sinh xung đột. Mở sample.txt sau khi sửa chỗ xung đột, thì commit lên.

$ git add sample.txt $ git commit

Khi ai đó yêu cầu thực hiện cherry-pick một commit trên nhánh dev về nhánh master sử dụng Git thì chính xác thì điều đó có nghĩa là gì?

Nếu bạn nhận được yêu cầu tương tự như trên mà chưa biết phải làm gì thì hãy tham khảo bài viết ngắn này vì thuật ngữ này cũng không khó hiểu như cách phát âm dài dòng của nó.

Lưu ý: Bạn cần nắm được cơ bản về nhánh [branch] và merge trong Git trước khi tham khảo phần tiếp theo.

Cherry-Pick Là Gì

Bỏ qua cách phát âm phức tạp thì cherry-pick thực chất là một cách để checkout một commit tại branch nhất định về branch hiện tại. Hay nói một cách dân dã thì cherry-pick dùng để bưng các thay đổi trong một commit trên một nhánh nào đó áp dụng về nhánh hiện tại.

Ví dụ trên repo [local] trên máy của bạn có hai nhánh là master và một nhánh feature-dev dùng để phát triển một tính năng thanh toán online. Để phát triển tính năng này
bạn cần làm các công việc nhỏ sau:

  • Thanh toán bằng thẻ ngân hàng qua ví Payoo.
  • Thanh toán bằng thẻ ngân hàng thông qua Ngân Lượng.
  • Thanh toán bằng Visa.

Sau đó bạn chuyển qua nhánh feature-dev để bắt đầu phát triển từng phần của tính năng. Tuy nhiên sau đó không lâu thì bạn nhận được yêu cầu của sếp deploy gấp phiên bản mới để demo cho khách hàng. Lúc này bạn mới chỉ hoàn thành xong 2 phần đầu là Thanh toán bằng thẻ ngân hàng qua ví Payoo và Thanh toán bằng thẻ ngân hàng thông qua Ngân Lượng trong tính năng mới này.

Khi xem log trên nhánh feature-dev của bạn với 7 commit gần nhất có kết quả như sau:

-> ... ... -> commit hash: A1 bắt đầu implement Payoo -> commit hash: A2 fix bug -> commit hash: A3 xong Payoo -> commit hash: B1 bắt đầu implement Ngân Lượng -> commit hash: B2 fix bug -> commit hash: B3 xong Ngân Lượng -> commit hash: C1 bắt đầu implement Visa

Để đảm bảo khách hàng vẫn thấy được các tính năng thanh toán Payoo và Ngân Lượng bạn muốn lấy commit B3 để áp dụng vào nhánh master. Lúc này bạn sẽ sử dụng cherry-pick của Git.

Đầu tiên bạn cần checkout về nhánh master:

$ git checkout master

Và sau đó thực hiện việc pick:

$ git cherry-pick B3

Lúc này nhánh master sẽ áp dụng các thanh đổi trong commit B3 về nhánh master.

So Sánh Cherry-Pick và Merge

Một tính năng trong Git khá giống với cherry-pick đó là merge branch.

Khi muốn merge các thanh đổi có trong nhánh feature-dev về nhánh master chúng ta sẽ làm các bước như sau.

Đầu tiên checkout về nhánh master:

$ git checkout master

Và sau đó thực hiện việc merge nhánh feature-dev về nhánh master:

$ git merge feature-dev

Khác biệt khi bạn thực hiện động tác merge branch như trên đó là Git sẽ áp dụng các thanh đổi của commit mới nhất trong nhánh feature-dev về nhánh master. Nghĩa là Git sẽ lấy các thanh đổi
trong commit C1 và áp dụng về nhánh master.

Video liên quan

Chủ Đề