เมื่อพูดถึงภารกิจที่หลากหลาย คือ ก็ไม่จริง
ในฐานะที่ระบุไว้ด้านล่างโดยคี ธ คิม , 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