ข้าม--ontoไปสักครู่ upstreamและbranchค่อนข้างพื้นฐานและเรียงลำดับจากการเลียนแบบcheckoutและbranch- อาร์กิวเมนต์ที่สองเป็นทางเลือก:
git branch <newbranch>
git branch <newbranch> <base>
git checkout -b <newbranch>
git checkout -b <newbranch> <base>
git rebase <upstream>
git rebase <upstream> <branch>
(นอกเหนือชื่อของการขัดแย้งเหล่านี้ในrebase"ต้นน้ำ" และ "สาขา" ไม่ได้มากพรรณนา IMO ฉันมักจะคิดว่าพวกเขาเช่น peachoftree. <start>และ<end>ซึ่งเป็นวิธีการที่ฉันจะใช้พวกเขา git rebase <start> <end>)
เมื่อละเว้นสาขาที่สองผลลัพธ์จะเหมือนกับการตรวจสอบจากสาขานั้นก่อนแล้วจึงทำราวกับว่าคุณไม่ได้ระบุสาขานั้น ข้อยกเว้นคือbranchสิ่งที่ไม่เปลี่ยนสาขาปัจจุบันของคุณ:
git checkout <base> && git branch <newbranch> && git checkout <previous_branch>
git checkout <base> && git checkout -b <newbranch>
git checkout <end> && git rebase <start>
สำหรับความเข้าใจว่าrebaseเมื่อไรที่เรียกใช้ฉันแรกเริ่มโดยคิดว่าเป็นการผสานแบบพิเศษ มันไม่ได้จริงๆ แต่มันช่วยเมื่อแรกเริ่มเข้าใจ rebase วิธียืมตัวอย่างของ peachoftree:
A--B--F--G master
\
C--D--E feature
git merge masterผลในครั้งนี้:
A--B--F-----G master
\ \
C--D--E--H feature
ในgit rebase masterขณะที่featureผลลัพธ์(ในขณะที่สาขา!):
A--B--F--G master
\
C'--D'--E' feature
ในทั้งสองกรณีfeatureนี้มีรหัสจากทั้งสองและmaster featureหากคุณไม่ได้อยู่คุณfeatureสามารถใช้อาร์กิวเมนต์ที่สองเพื่อเปลี่ยนเป็นทางลัด: git rebase master featureจะทำสิ่งเดียวกันกับด้านบน
--ontoตอนนี้สำหรับพิเศษ ส่วนที่สำคัญที่ต้องจำในการทำเช่นนี้คือมันจะมีค่าเริ่มต้น<start>หากไม่ได้ระบุไว้ ดังนั้นข้างต้นหากฉันระบุ--ontoโดยเฉพาะสิ่งนี้จะส่งผลเหมือนกัน:
git rebase --onto master master
git rebase --onto master master feature
(ฉันไม่ได้ใช้--ontoโดยไม่ได้ระบุ<end>เพียงเพราะมันง่ายกว่าในการแยกวิเคราะห์ทางจิตใจแม้จะคิดว่าทั้งสองเหมือนกันถ้าเปิดอยู่แล้วfeature)
หากต้องการดูว่าเพราะเหตุใดจึง--ontoมีประโยชน์ต่อไปนี้เป็นตัวอย่างที่แตกต่างกัน สมมติว่าฉันเปิดfeatureและสังเกตเห็นข้อผิดพลาดซึ่งฉันเริ่มแก้ไข - แต่แยกออกจากfeatureแทนmasterโดยไม่ได้ตั้งใจ:
A--B--F--G master
\
C--D--E feature
\
H--I bugfix
สิ่งที่ผมต้องการคือการ "ย้าย" กระทำเหล่านี้เพื่อให้พวกเขาไม่ได้อยู่บนขึ้นbugfix featureมันคือการจัดเรียงของการผสานหรือ rebase ใด ๆ ดังกล่าวข้างต้นแสดงให้เห็นในคำตอบนี้จะใช้เวลาสามfeatureกระทำพร้อมกับสองbugfixกระทำ
ตัวอย่างเช่นgit rebase master bugfixผิด ช่วงที่<start>จะ<end>เกิดขึ้นเพื่อรวมการกระทำทั้งหมดfeatureที่มีการเล่นซ้ำบนmaster:
A--B--F--G master
\ \
\ C'--D'--E'--H'--I' bugfix
\
C--D--E feature
สิ่งที่เราต้องการจริงเป็นช่วงของกระทำจากfeatureการที่จะต้องย้อนด้านบนของbugfix masterนั่นคือสิ่งที่--ontoมีไว้เพื่อ - ระบุเป้าหมาย "เล่นซ้ำ" ที่แตกต่างจากสาขา "เริ่มต้น":
git rebase --onto master feature bugfix
A--B--F--G master
\ \
\ H'--I' bugfix
\
C--D--E feature