Khi nói đến một loạt các cam kết, chọn hoa anh đào làlà không thực tế.
Như mentioned below bởi Keith Kim, Git 1.7.2+ giới thiệu khả năng anh đào-chọn một loạt các cam kết (nhưng bạn vẫn cần phải nhận thức được các consequence of cherry-picking for future merge)
git cherry-pick" learned to pick a range of commits
(e.g. " cherry-pick A..B
" and " cherry-pick --stdin
"), so did " git revert
"; these do not support the nicer sequencing control " rebase [-i]
" has, though.
damiancomments và cảnh báo với chúng tôi:
In the " cherry-pick A..B
" form, A
should be older than B
.
If they're the wrong order the command will silently fail.
Nếu bạn muốn chọn phạm vi B
qua D
(bao gồm) sẽ là B^..D
.
Xem "Git create branch from range of previous commits?" làm minh họa.
Như Jubobs đề cập in the comments:
This assumes that B
is not a root commit; you'll get an " unknown revision
" error otherwise.
Lưu ý: như của Git 2.9.x/2.10 (Q3 2016), bạn có thể cherry-chọn một loạt các cam kết trực tiếp trên một chi nhánh trẻ mồ côi (trống đầu): xem "How to make existing branch an orphan in git".
câu trả lời gốc (January 2010)
Một rebase --onto
sẽ tốt hơn, nơi bạn phát lại phạm vi nhất định cam kết trên đầu trang của chi nhánh tích hợp của bạn, như Charles Bailey described here.
(cũng có, tìm kiếm "Đây là cách bạn sẽ cấy ghép một chi nhánh chủ đề dựa trên một chi nhánh khác" trong git rebase man page, để xem một ví dụ thực tế của git rebase --onto
)
Nếu chi nhánh hiện tại của bạn là tích hợp:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
Điều đó sẽ phát lại tất cả mọi thứ giữa:
- sau khi mẹ của
first_SHA-1_of_working_branch_range
(vì thế ~1
): cam kết đầu tiên bạn muốn phát lại
- lên đến "
integration
" (mà chỉ vào cam kết cuối cùng bạn muốn phát lại, từ chi nhánh working
)
để "tmp
" (mà chỉ vào nơi integration
được chỉ trước đó)
Nếu có bất kỳ mâu thuẫn khi một trong những cam kết là tái hiện lại:
- hoặc giải quyết nó và chạy "
git rebase --continue
".
- hoặc bỏ bản vá này, và thay vào đó chạy "
git rebase --skip
"
- hoặc hủy bỏ tất cả các điều với một "
git rebase --abort
" (và đưa trở lại các chi nhánh integration
trên cành tmp
)
Sau đó rebase --onto
, integration
sẽ quay trở lại cam kết cuối cùng của nhánh hội nhập (nghĩa là "tmp
" chi nhánh + tất cả các khoản cam kết được phát lại)
Với lựa chọn anh đào hoặc rebase --onto
, đừng quên nó có hậu quả trên phân lớp con nt hợp nhất, như described here.
Một tinh khiết "cherry-pick
" Giải pháp là discussed here, và sẽ bao gồm một cái gì đó như:
If you want to use a patch approach then "git format-patch|git am" and "git cherry" are your options.
Currently, git cherry-pick
accepts only a single commit, but if you want to pick the range B
through D
that would be B^..D
in git lingo, so
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Nhưng dù sao, khi bạn cần phải "phát lại" một loạt các cam kết, từ " phát lại "sẽ đẩy bạn sử dụng tính năng" rebase
"của Git.
http://www.draconianoverlord.com/2013/09/07/no-cherry-picking.html (không phải blog của tôi) –