เมื่อพูดถึงภารกิจที่หลากหลาย คือ ก็ไม่จริง
ในฐานะที่ระบุไว้ด้านล่างโดยคี ธ คิม , Git 1.7.2+ แนะนำความสามารถในการเชอร์รี่เลือกช่วงของการกระทำ ( แต่คุณยังคงต้องตระหนักถึงผลที่ตามมาของเชอร์รี่ยกสำหรับการผสานอนาคต )
เชอร์รี่รับของคอมไพล์" เรียนรู้ที่จะรับช่วงของการกระทำ
(เช่น ' cherry-pick A..B' และ ' cherry-pick --stdin') เพื่อให้ได้' git revert'เหล่านี้ไม่สนับสนุนการควบคุมลำดับดีกว่า' rebase [-i]' มี แต่
เดเมียน แสดงความคิดเห็นและเตือนเรา:
ใน " cherry-pick A..B" รูปแบบควรจะเก่ากว่าA Bหากพวกเขากำลังผิดลำดับคำสั่งเงียบจะล้มเหลว
หากคุณต้องการที่จะเลือกช่วงBผ่านD(รวม)B^..Dที่จะเป็น
ดูที่ " Git สร้างสาขาจากช่วงที่ทำก่อนหน้านี้? " เป็นภาพประกอบ
ในฐานะที่เป็นJubobsกล่าวถึงในความคิดเห็น :
นี่ถือว่าBไม่ใช่การกระทำที่รูท; คุณจะได้รับunknown revisionข้อผิดพลาด ""
หมายเหตุ: ตั้งแต่ Git 2.9.x / 2.10 (ไตรมาสที่ 3 ปี 2559) คุณสามารถเลือกช่วงของการกระทำโดยตรงในสาขาเด็กกำพร้า (หัวว่าง): ดู " วิธีทำให้สาขาที่มีอยู่เป็นเด็กกำพร้าในคอมไพล์ "
คำตอบเดิม (มกราคม 2010)
rebase --ontoจะดีกว่าที่คุณเล่นในช่วงที่กำหนดของการกระทำที่ด้านบนของสาขาบูรณาการของคุณเป็นชาร์ลส์เบลีย์อธิบายไว้ที่นี่
(เช่นเดียวกับค้นหา "นี่คือวิธีที่คุณจะปลูกสาขาหัวข้อตามสาขาหนึ่งไปยังอีก" ในหน้า man rebase gitเพื่อดูตัวอย่างการปฏิบัติของgit rebase --onto)
หากสาขาปัจจุบันของคุณคือการรวม:
# 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
ที่จะเล่นซ้ำทุกสิ่งระหว่าง:
- หลังจากที่ผู้ปกครองของ
first_SHA-1_of_working_branch_range(จึง~1): คนแรกที่กระทำคุณต้องการที่จะเล่นซ้ำ
- มากถึง "
integration" (ซึ่งชี้ไปที่การส่งมอบครั้งสุดท้ายที่คุณต้องการเล่นซ้ำจากworkingสาขา)
ถึง " tmp" (ซึ่งชี้ไปยังตำแหน่งที่integrationชี้ก่อน)
หากมีข้อขัดแย้งใด ๆ เมื่อหนึ่งในข้อผูกพันเหล่านั้นถูกเล่นซ้ำ:
- แก้ปัญหาและเรียกใช้ "
git rebase --continue"
- หรือข้ามแพทช์นี้และรัน "
git rebase --skip" แทน
- หรือยกเลิกทุกสิ่งด้วย "
git rebase --abort" (และนำintegrationสาขากลับมาที่tmpสาขา)
หลังจากนั้นrebase --onto, integrationจะกลับไปที่สุดท้ายกระทำของสาขาบูรณาการ (นั่นคือ " tmpสาขา" + ทุกกระทำเล่นซ้ำ)
ด้วยเชอร์รี่แคะหรือrebase --ontoไม่ลืมที่จะมีผลกระทบในการผสานต่อมาเป็นอธิบายไว้ที่นี่
มีcherry-pickการกล่าวถึงวิธีแก้ปัญหาที่บริสุทธิ์และจะเกี่ยวข้องกับสิ่งต่อไปนี้:
หากคุณต้องการใช้วิธีแก้ไข "git format-patch | git am" และ "git cherry" เป็นตัวเลือกของคุณ
ปัจจุบันgit cherry-pickยอมรับเพียงคนเดียวกระทำ แต่ถ้าคุณต้องการที่จะรับช่วงBผ่านDที่จะเป็นB^..Dในคอมไพล์ศัพท์แสงดังนั้น
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
แต่อย่างไรก็ตามเมื่อคุณต้องการ "เล่นซ้ำ" ช่วงคำว่า "เล่นซ้ำ" ควรผลักดันให้คุณใช้rebaseคุณสมบัติ "" ของ Git