Làm cách nào để hợp nhất một cam kết cụ thể từ chi nhánh này sang chi nhánh khác trong Git?


Câu trả lời:


233

Các git cherry-pick <commit>lệnh cho phép bạn để có một cam kết duy nhất (từ bất cứ chi nhánh) và, về cơ bản, rebase nó trong chi nhánh làm việc của bạn.

Chương 5 của cuốn sách Git Pro giải thích nó tốt hơn tôi có thể , hoàn thành với các sơ đồ và như vậy. ( Chương về Rebasing cũng là cách đọc tốt.)

Cuối cùng, có một số ý kiến ​​tốt về việc chọn anh đào vs sáp nhập và nổi loạn trong một câu hỏi SO khác .


1
Câu hỏi: nói rằng cam kết Ađược phân nhánh mastervà bạn thực hiện một số công việc trên nó, tạo ra các cam kết con Bthông qua E. Nói Echỉ có 1 dòng được thêm từ D. Nếu bạn git cherry-pick Evào master, nó có áp dụng tất cả các thay đổi từ Axuyên qua Evào masterchi nhánh không, hay nó chỉ áp dụng thay đổi từ Dđến E, cụ thể là, nó chỉ thêm 1 dòng đó vào master? Nếu trường hợp là cái trước, làm thế nào để tôi đạt được cái sau? (ngoài việc sao chép và dán thủ công)
chharvey

7
git cherry-pick -n <commit> Nếu bạn không muốn cherry pick tự động cam kết.
Ben Flynn

6

Nếu BranchA chưa được đẩy đến một điều khiển từ xa thì bạn có thể sắp xếp lại các xác nhận bằng cách sử dụng rebasevà sau đó đơn giản merge. Nên sử dụng mergehơn rebasekhi có thể vì nó không tạo ra các cam kết trùng lặp.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]

2

NGUỒN: https://git-scm.com/book/en/v2/Distribution-Git-Maintained-a-Project#Integrating-Contribution-Work

Cách khác để di chuyển công việc được giới thiệu từ chi nhánh này sang chi nhánh khác là chọn anh đào. Một lựa chọn anh đào trong Git giống như một cuộc nổi loạn cho một cam kết duy nhất. Nó lấy bản vá được giới thiệu trong một cam kết và cố gắng áp dụng lại nó trên nhánh mà bạn hiện đang ở. Điều này hữu ích nếu bạn có một số cam kết trên một nhánh chủ đề và bạn chỉ muốn tích hợp một trong số chúng hoặc nếu bạn chỉ có một cam kết trên một nhánh chủ đề và bạn thích chọn cherry hơn là chạy rebase. Ví dụ: giả sử bạn có một dự án giống như thế này:

nhập mô tả hình ảnh ở đây

Nếu bạn muốn kéo commit e43a6 vào nhánh chính của mình, bạn có thể chạy

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

Điều này kéo theo cùng một thay đổi được giới thiệu trong e43a6, nhưng bạn nhận được giá trị SHA-1 cam kết mới, vì ngày áp dụng là khác nhau. Bây giờ lịch sử của bạn trông như thế này:

nhập mô tả hình ảnh ở đây

Bây giờ bạn có thể xóa chi nhánh chủ đề của mình và bỏ các cam kết mà bạn không muốn thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.