Tôi có BranchA
đó là 113 cam kết trước BranchB
.
Nhưng tôi chỉ muốn 10 cam kết cuối cùng được BranchA
hợp nhất vào BranchB
.
Có cách nào để làm việc này không?
Tôi có BranchA
đó là 113 cam kết trước BranchB
.
Nhưng tôi chỉ muốn 10 cam kết cuối cùng được BranchA
hợp nhất vào BranchB
.
Có cách nào để làm việc này không?
Câu trả lời:
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 .
A
được phân nhánh master
và 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 B
thông qua E
. Nói E
chỉ có 1 dòng được thêm từ D
. Nếu bạn git cherry-pick E
vào master
, nó có áp dụng tất cả các thay đổi từ A
xuyên qua E
vào master
chi 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)
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 rebase
và sau đó đơn giản merge
. Nên sử dụng merge
hơn rebase
khi 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]
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:
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:
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.