Khi nói đến một loạt các cam kết, chọn anh đào Là đã không thực tế.
Như đề cập dưới đây 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 những hậu quả của cherry-chọn cho tương lai hợp nhất )
git cherry-pick "đã học cách chọn một loạt các cam kết
(ví dụ" cherry-pick A..B
"và" cherry-pick --stdin
"), do đó" git revert
"; những điều này không hỗ trợ điều khiển trình tự đẹp hơn" rebase [-i]
", mặc dù vậy.
bình luận damian và cảnh báo chúng tôi:
Ở dạng " cherry-pick A..B
", A
nên cũ hơnB
.
Nếu chúng sai thứ tự, lệnh sẽ âm thầm thất bại .
Nếu bạn muốn chọn phạm vi B
thông qua D
(bao gồm) đó sẽ là B^..D
.
Xem " Git tạo chi nhánh từ phạm vi của các cam kết trước đó? " Như một minh họa.
Như Jubobs đề cập trong các ý kiến :
Điều này giả định rằng đó B
không phải là một cam kết gốc; bạn sẽ gặp unknown revision
lỗi "" nếu không.
Lưu ý: kể từ Git 2.9.x / 2.10 (quý 3 năm 2016), bạn có thể chọn một loạt các cam kết trực tiếp trên một nhánh mồ côi (đầu trống): xem " Cách biến nhánh hiện có thành một đứa trẻ mồ côi trong git ".
Câu trả lời gốc (tháng 1 năm 2010)
A rebase --onto
sẽ tốt hơn, nơi bạn phát lại phạm vi cam kết nhất định trên đầu nhánh tích hợp của bạn, như Charles Bailey đã mô tả ở đây .
(ngoài ra, hãy tìm "Đây là cách bạn sẽ ghép một nhánh chủ đề dựa trên nhánh này sang nhánh khác" trong trang man gase rebase , để xem một ví dụ thực tế về 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 mọi thứ giữa:
- sau cha 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
" (chỉ ra cam kết cuối cùng bạn muốn phát lại, từ working
chi nhánh)
đến " tmp
" (chỉ đến nơi integration
đã chỉ trước đó)
Nếu có bất kỳ xung đột nào khi một trong những cam kết đó được phát lại:
- hoặc giải quyết nó và chạy "
git rebase --continue
".
- hoặc bỏ qua bản vá này và thay vào đó chạy "
git rebase --skip
"
- hoặc hủy bỏ tất cả mọi thứ với một "
git rebase --abort
" (và đặt lại integration
nhánh trên tmp
nhánh)
Sau đó rebase --onto
, integration
sẽ trở lại ở lần xác nhận cuối cùng của nhánh tích hợp (đó là " tmp
" nhánh + tất cả các cam kết được phát lại)
Với việc hái anh đào hoặc rebase --onto
, đừng quên nó có hậu quả đối với các lần sáp nhập tiếp theo, như được mô tả ở đây .
Một cherry-pick
giải pháp " " thuần túy được thảo luận ở đây và sẽ liên quan đến một cái gì đó như:
Nếu bạn muốn sử dụng phương pháp vá lỗi thì "git format-patch | git am" và "git cherry" là những lựa chọn của bạn.
Hiện tại, git cherry-pick
chỉ chấp nhận một cam kết duy nhất, nhưng nếu bạn muốn chọn phạm vi B
thông qua D
đó sẽ là B^..D
trong biệt ngữ git, vì vậy
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Nhưng dù sao đi nữa, khi bạn cần "phát lại" một loạt các cam kết, từ "phát lại" sẽ thúc đẩy bạn sử dụng rebase
tính năng "" của Git.