ข้าม--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